2015-01-09 3 views
0

Я не решаюсь спросить об этом, потому что у меня есть обходное решение, но я бы предпочел более чистый ответ.Excel VBA: Скрыть все столбцы, затем показать некоторые столбцы

Я использую Excel 2010, и у меня есть процедура, которая делает некоторое базовое форматирование на новом листе: скрывает все столбцы, устанавливает текст строки заголовка, форматирует строку заголовка, отображает столбцы, которые использует строка заголовка. Проблема в том, что «невидимка» не совсем работает. После выполнения процедуры рабочий лист выглядит так, как будто все столбцы по-прежнему скрыты, но если я изменяю размер строки формул, столбцы, которые будут отображаться процедурой unhid, выглядят так, как я ожидал. Даже когда книга сохранена, закрыта и снова открыта, столбцы не отображаются, пока я не изменю размер панели формул.

Я попытался использовать DoEvents для обновления экрана. Я пробовал установить Application.ScreenUpdating на true, хотя я никогда не устанавливал его в false. Я даже пытался скрывать и показывать формулу через VBA. Единственное, что работает (мое обходное решение) - изменить размер панели формул как часть процедуры. Он работает, но кажется, что это не обязательно. Он может работать, чтобы активировать диапазон, прежде чем я его покажу, но я предпочитаю не использовать Activate или Select в VBA.

Любые мысли?

Private Sub FormatSheet(sh As Worksheet) 
    Dim HeaderText As Variant 
    Dim EndCol As Long 
    Dim Header As Range 

    'header items for sheet 
    HeaderText = Array("DATE", "USER", "BC", "TC", "SUM") 

    'get last column index based on headers 
    EndCol = UBound(HeaderText) - LBound(HeaderText) + 1 

    With sh 
     'hide all columns in the sheet 
     .Columns.Hidden = True 

     'set the header range 
     Set Header = .Range(.Cells(2, 1), .Cells(2, EndCol)) 

     'set the header text 
     Header = HeaderText 

     'set the header row formatting 
     With .Rows(2) 
      .Font.Bold = True 
      .Interior.Color = RGB(217, 217, 217) 
      With .Borders(xlEdgeBottom) 
       .LineStyle = xlContinuous 
       .Weight = xlThin 
      End With 
     End With 

     'unhide the columns used by the header 
     Header.EntireColumn.Hidden = False 

     'resize the formula bar to force the unhide to work 
     Application.FormulaBarHeight = 5 
     Application.FormulaBarHeight = 1 

     'autofit columns 
     .Columns.AutoFit 
    End With 
End Sub 
+0

У этого есть кольцо ошибки Microsoft. – theMayer

ответ

0

LastCol = Range ("A1"). End (xlToRight) .Column

С ш

.Cells(1, EndCol + 1).Resize(, LastCol - EndCol).Columns.Hidden = True 

End With

+0

Я отметил это как ответ, хотя я использовал немного другую форму для скрытой строки: 'Header.Offset (, EndCol) .Resize (, LastCol - EndCol) .Columns.Hidden = True'. Благодаря! – phrebh

1

Если вы хотите, чтобы отобразить все клетки:

cells.EntireColumn.Hidden = False 

И если вы хотите, чтобы отобразить на 5 столбцов, которые используются в заголовке, а затем:

Range(Cells(1, 1), Cells(1, EndCol)).EntireColumn.Select 

Это будут отображаться только столбцы, находящиеся в «заголовке», и его нужно поместить за пределы оператора WITH для работы (поместите его как последнюю строку). Он использует .select, я знаю, но тот единственный способ, которым я могу заставить его работать ....

0

следующая скроет все столбцы затем выборочно отобразить.

worksheet.Cells.EntireColumn.Hidden = true 
worksheet.Cells(1,1).EntireColumn.Hidden = false 
worksheet.Cells(1,2).EntireColumn.Hidden = false 

примечание Это работает только с колоннами

worksheet.Cells.EntireRow.Hidden = true 

не работает.