Уважаемые, всем привет. Скажите по опыту что быстрее будет работать перебор ячеек циклом или описание конкретной ячейки в коде [vba]
Код
Dim i& For i = 32 To 231 If Range("AH" & i).Value = 0 Then Rows(i).EntireRow.Hidden = True Else: Rows(i).EntireRow.Hidden = False ' End If Next Application.Calculation = xlAutomatic Application.ScreenUpdating = True
[/vba] против что-то подобного [vba]
Код
If Range("AH32").Value = 0 Then Rows(32).EntireRow.Hidden = True Else: Rows(32).EntireRow.Hidden = False ' End If If Range("AH33").Value = 0 Then Rows(33).EntireRow.Hidden = True Else: Rows(33).EntireRow.Hidden = False ' End If . . . If Range("AH231").Value = 0 Then Rows(i).EntireRow.Hidden = True Else: Rows(231).EntireRow.Hidden = False ' End If Application.Calculation = xlAutomatic Application.ScreenUpdating = True
[/vba]
ну или как увеличить скорость цикла по 200 строкам?
Уважаемые, всем привет. Скажите по опыту что быстрее будет работать перебор ячеек циклом или описание конкретной ячейки в коде [vba]
Код
Dim i& For i = 32 To 231 If Range("AH" & i).Value = 0 Then Rows(i).EntireRow.Hidden = True Else: Rows(i).EntireRow.Hidden = False ' End If Next Application.Calculation = xlAutomatic Application.ScreenUpdating = True
[/vba] против что-то подобного [vba]
Код
If Range("AH32").Value = 0 Then Rows(32).EntireRow.Hidden = True Else: Rows(32).EntireRow.Hidden = False ' End If If Range("AH33").Value = 0 Then Rows(33).EntireRow.Hidden = True Else: Rows(33).EntireRow.Hidden = False ' End If . . . If Range("AH231").Value = 0 Then Rows(i).EntireRow.Hidden = True Else: Rows(231).EntireRow.Hidden = False ' End If Application.Calculation = xlAutomatic Application.ScreenUpdating = True
[/vba]
ну или как увеличить скорость цикла по 200 строкам?Sancho
Сообщение отредактировал Sancho - Воскресенье, 05.06.2016, 19:27
Из двух приложенных вариантов чууууть-чуть быстрее должен работать второй. В первом немного времени тратится еще на изменение показателя i с каждым циклом и на определение i в конструкции Range("AH" & i). Но на самом деле разница настолько мизерна, что никто ее не учитывает никогда. Основное время в подобных этому макросах обычно тратится на работу с данными на листах. Не раздумывая, а просто попытавшись как-то улучшить уже имеющийся код, можно предложить: 1. перед циклом сразу написать открытие всех строк с 32 по 231, тогда кусок с Else уже не нужен - обращаемся к листу только в случае равенства нулю 2. засунуть данные АН32:АН231 в массив и потом делать цикл по элементам этого массива - обращаемся к листу только один раз Что-то типа вот так [vba]
Код
Sub tt() Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual Range("A32:A231").EntireRow.Hidden = False ar = Range("A32:A231") n1_ = UBound(ar) For i = 1 To n1_ If ar(i, 1) = 0 Then Range("A" & i + 31).EntireRow.Hidden = True End If Next Application.Calculation = xlAutomatic End Sub
[/vba] Можно попробовать еще ускорить, применив другой подход, но не совсем ясна причина такого Вашего вопроса - вроде и без этого все быстро работат. Да и файл нужен тогда.
Из двух приложенных вариантов чууууть-чуть быстрее должен работать второй. В первом немного времени тратится еще на изменение показателя i с каждым циклом и на определение i в конструкции Range("AH" & i). Но на самом деле разница настолько мизерна, что никто ее не учитывает никогда. Основное время в подобных этому макросах обычно тратится на работу с данными на листах. Не раздумывая, а просто попытавшись как-то улучшить уже имеющийся код, можно предложить: 1. перед циклом сразу написать открытие всех строк с 32 по 231, тогда кусок с Else уже не нужен - обращаемся к листу только в случае равенства нулю 2. засунуть данные АН32:АН231 в массив и потом делать цикл по элементам этого массива - обращаемся к листу только один раз Что-то типа вот так [vba]
Код
Sub tt() Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual Range("A32:A231").EntireRow.Hidden = False ar = Range("A32:A231") n1_ = UBound(ar) For i = 1 To n1_ If ar(i, 1) = 0 Then Range("A" & i + 31).EntireRow.Hidden = True End If Next Application.Calculation = xlAutomatic End Sub
[/vba] Можно попробовать еще ускорить, применив другой подход, но не совсем ясна причина такого Вашего вопроса - вроде и без этого все быстро работат. Да и файл нужен тогда._Boroda_
_Boroda_, да, отключил этот блок скрытия строк при активации листа скорости не прибавилось. -:( скорее повлияли так на работу 7ми этажные формулы "если" на эти 200 строк. [moder]Вам не кажется, что это прекрасный повод показать сие чудо нам? Может, мы этаж-другой и отломаем.[/moder]
_Boroda_, да, отключил этот блок скрытия строк при активации листа скорости не прибавилось. -:( скорее повлияли так на работу 7ми этажные формулы "если" на эти 200 строк. [moder]Вам не кажется, что это прекрасный повод показать сие чудо нам? Может, мы этаж-другой и отломаем.[/moder]Sancho
Сообщение отредактировал _Boroda_ - Воскресенье, 05.06.2016, 21:01
Существенно быстрей будет работать формирование строки адресов и потом скрытие одним махом. Еще вариант быстрей - rowdifferents, еще автофильтр: [vba]
Код
Sub www1() Dim i&, c$, a$, ar Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual Range("A32:A231").EntireRow.Hidden = False ar = Range("A32:A231") n1_ = UBound(ar) For i = 1 To n1_ If Not IsEmpty(ar(i, 1)) And ar(i, 1) = 0 Then a = i + 31 & ":" & i + 31 & "," If Len(c & a) > 255 Then Range(Left$(c, Len(c) - 1)).EntireRow.Hidden = True c = a Else c = c & a End If End If Next Range(Left$(c, Len(c) - 1)).EntireRow.Hidden = True Application.Calculation = xlAutomatic End Sub
Public Sub www() On Error Resume Next ActiveSheet.AutoFilterMode = 0 Range("A32:A231").EntireRow.Hidden = False Range("A31:A231").AutoFilter 1, "<>0", , , 0 End Sub
[/vba]
Существенно быстрей будет работать формирование строки адресов и потом скрытие одним махом. Еще вариант быстрей - rowdifferents, еще автофильтр: [vba]
Код
Sub www1() Dim i&, c$, a$, ar Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual Range("A32:A231").EntireRow.Hidden = False ar = Range("A32:A231") n1_ = UBound(ar) For i = 1 To n1_ If Not IsEmpty(ar(i, 1)) And ar(i, 1) = 0 Then a = i + 31 & ":" & i + 31 & "," If Len(c & a) > 255 Then Range(Left$(c, Len(c) - 1)).EntireRow.Hidden = True c = a Else c = c & a End If End If Next Range(Left$(c, Len(c) - 1)).EntireRow.Hidden = True Application.Calculation = xlAutomatic End Sub
Public Sub www() On Error Resume Next ActiveSheet.AutoFilterMode = 0 Range("A32:A231").EntireRow.Hidden = False Range("A31:A231").AutoFilter 1, "<>0", , , 0 End Sub