2013-05-29 3 views
1

Я пытаюсь ускорить мой код VBA и не знаю, как это сделать. Самая медленная задача - мой цикл, чтобы скрыть пустые строки. (Я несколько сводных таблиц выровнены по вертикали, и мне пришлось оставить пространство, чтобы дать им возможность расширяться при добавлении новых данных.)Каков самый быстрый способ условного скрыть ряд строк в VBA?

Public Sub HideRows(list1 As Range) 
Dim cell As Range 

    For Each cell In list1 
     cell.EntireRow.Hidden = (cell.Value = "") 
    Next cell 
End Sub 

Public Sub UnhideRows(list1 As Range) 
Dim cell As Range 

    For Each cell In list1 

     If (cell.Value <> "") Then cell.EntireRow.Hidden = False 
    Next cell 
End Sub 
+0

Как вы называете свои подделки 'HideRows' и' UnhideRows'? какие у вас диапазоны list1? дайте пример ... –

+0

Call HideRows (Range («SHORTprcal»)), я делаю этот вызов четыре раза перед тем, как вернуться к Application.ScreenUpdating – iontom

+1

Какой точный адрес диапазона - ваш «SHORTprcal»? –

ответ

2

Нет необходимости в цикле - вы должны быть в состоянии скрыть весь диапазон всего в один раз - я тестировал с помощью этого суб:

Public Sub HideRows_test(list1 As Range) 
    list1.EntireRow.Hidden = True 
End Sub 

редактировать: извините, я поторопился на это, не понимал, что было условием на полигоне. Однако вместо того, чтобы скрывать каждый отдельно, вы можете построить новый диапазон с помощью существующего цикла, а затем скрыть все строки в нем.

редактировать: Я упомянул вы можете создать диапазон динамически, а затем скрыть все строки в конце - вот как:

Public Sub HideRows(list1 As Range) 
    Dim cellsToHide As Range 
    Set cellsToHide = Nothing 

    Dim cell As Range 
    For Each cell In list1 
     If cell.Value = "" Then 
      If cellsToHide Is Nothing Then 
       Set cellsToHide = cell 
      Else 
       Set cellsToHide = Union(cellsToHide, cell) 
      End If 
     End If 
    Next cell 
    cellsToHide.EntireRow.Hidden = True 

End Sub 

Однако, я думаю, что вы действительно можете избавиться от для каждый полностью используя SpecialCells(xlCellTypeBlanks), например, так:

Public Sub HideRows(list1 As Range) 
    Set list1 = list1.SpecialCells(xlCellTypeBlanks) 
    list1.EntireRow.Hidden = True 
End Sub 
+0

Спасибо! Я называю это иначе? Call HideRows (диапазон («SHORTprcal»)) до Call HideRows («SHORTprcal»)? РЕДАКТИРОВАТЬ: Просто заметил ваше редактирование. Hmmm – iontom

+0

'SpecialCells (xlCellTypeBlanks)' - путь. +1 –

1

Посмотрите в использовании Application.ScreenUpdating. Установка этого параметра на false позволяет Excel обновлять дисплей после каждой операции, что значительно увеличивает скорость - ESPECIALLY при использовании медленной команды, такой как hide/unhide.

Если вам не нужно проходить через ваши камеры, вы можете сделать что-то похожее на mr Reband's answer.

Но в целом Application.ScreenUpdating = false ускорит почти весь код, взаимодействующий с Excel значительно.

Public Sub HideRows(list1 As Range) 
Dim cell As Range 
Application.ScreenUpdating = False 
    For Each cell In list1 
     cell.EntireRow.Hidden = (cell.Value = "") 
    Next cell 
Application.ScreenUpdating = True 
End Sub 

Public Sub UnhideRows(list1 As Range) 
Dim cell As Range 
Application.ScreenUpdating = False 

    For Each cell In list1 

     If (cell.Value <> "") Then cell.EntireRow.Hidden = False 
    Next cell 
Application.ScreenUpdating = True 
End Sub 
+0

Я уже выключил экран, но это хорошая информация для кого-то еще! Благодаря! – iontom

Смежные вопросы