2016-01-21 3 views
3

У меня есть таблица элементов и величин, где я хочу скрыть строки, когда количество равно 0. Макрос работает, но для завершения требуется слишком много времени.Скрыть строки на основе значения ячейки

Это код:

Sub Hide2ndFix() 
' 
' Hide2ndFix Macro 
' 
BeginRow = 414 
EndRow = 475 
ChkCol = 24 

    For RowCnt = BeginRow To EndRow 
     If Cells(RowCnt, ChkCol).Value = 0 Then 
      Cells(RowCnt, ChkCol).EntireRow.Hidden = True 
     End If 
    Next RowCnt 
' 
End Sub 

Есть более эффективный способ получить тот же результат, убежищ строк 414-475, если значение в столбце X является 0?

+0

Проблема заключается в том, вероятно, что есть расчеты происходят каждый цикл. В начале кода добавьте 'application.Calculation = xlCalculationManual' и в конце' application.Calculation = xlCalculationAutomatic' –

+0

Также эта строка 'Cells (RowCnt, ChkCol) .EntireRow.Hidden = True' может быть сокращена до' Строки (RowCnt) .Hidden = True' –

ответ

3

Обычный способ сделать любой код (который делает любое изменение в книге) быстрее является отключение screen updating и отключение events и изменение режима calculation к Manual (есть и другие способы, но эти 3 вещи, которые имеют наибольший коэффициент) ,

И все остальное состоит в том, что сбор всех строк в одном диапазоне объединений имеет большой фактор в удалении и вставке строк, потому что время, необходимое для удаления одной строки, похоже на время удаления всего диапазона объединения. Например, если для удаления одной строки требуется 1 секунда, то для удаления 1000 строк потребуется 1000 секунд, но для удаления диапазона объединения, содержащего 1000 строк, требуется только 1 секунда.

Попробуйте этот код:

Sub Hide2ndFix() 
' 
' Hide2ndFix Macro 
' 
Dim RowCnt As Long, uRng As Range 
Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

BeginRow = 414 
EndRow = 475 
ChkCol = 24 

    For RowCnt = BeginRow To EndRow 
     If Cells(RowCnt, ChkCol).Value = 0 Then 
     If uRng Is Nothing Then 
      Set uRng = Cells(RowCnt, ChkCol) 
     Else 
      Set uRng = Union(uRng, Cells(RowCnt, ChkCol)) 
     End If 

     End If 
    Next RowCnt 
' 
If Not uRng Is Nothing Then uRng.EntireRow.Hidden = True 

Application.ScreenUpdating = True 
Application.EnableEvents = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 
+2

Как всегда, ваш код является кратким из-за проблемы. Небольшое объяснение того, что вы делаете, сделает этот отличный ответ, особенно когда он отклоняется от базового кода OPs. Многие, кто приходит сюда, не понимают, что происходит, и быстрое объяснение может помочь им помочь себе в будущем. –

+1

@ScottCraner, моя проблема в том, что я использую перевод Google для написания на английском языке :). но я попытаюсь объяснить, что я изменяю и надеюсь, что ничего не напишу. – Fadi

+0

Я понимаю, сделайте все возможное, и если вы не возражаете, другие помогут с правильными исправлениями в грамматике. Мы просто не хотим предполагать ваши намерения. –

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