Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Что быстрее будет работать перебор ячеек циклом или ссылка? - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Что быстрее будет работать перебор ячеек циклом или ссылка? (Макросы/Sub)
Что быстрее будет работать перебор ячеек циклом или ссылка?
Sancho Дата: Воскресенье, 05.06.2016, 19:15 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 88
Репутация: 0 ±
Замечаний: 0% ±

2007, 2010, 2013
Уважаемые, всем привет. Скажите по опыту что быстрее будет работать перебор ячеек циклом или описание конкретной ячейки в коде
[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 - Воскресенье, 05.06.2016, 19:27
 
Ответить
СообщениеУважаемые, всем привет. Скажите по опыту что быстрее будет работать перебор ячеек циклом или описание конкретной ячейки в коде
[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
Дата добавления - 05.06.2016 в 19:15
_Boroda_ Дата: Воскресенье, 05.06.2016, 19:39 | Сообщение № 2
Группа: Модераторы
Ранг: Экселист
Сообщений: 9348
Репутация: 3922 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Из двух приложенных вариантов чууууть-чуть быстрее должен работать второй. В первом немного времени тратится еще на изменение показателя 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_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеИз двух приложенных вариантов чууууть-чуть быстрее должен работать второй. В первом немного времени тратится еще на изменение показателя 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_
Дата добавления - 05.06.2016 в 19:39
Sancho Дата: Воскресенье, 05.06.2016, 20:29 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 88
Репутация: 0 ±
Замечаний: 0% ±

2007, 2010, 2013
_Boroda_, да, отключил этот блок скрытия строк при активации листа скорости не прибавилось. -:( скорее повлияли так на работу 7ми этажные
формулы "если" на эти 200 строк.
[moder]Вам не кажется, что это прекрасный повод показать сие чудо нам? Может, мы этаж-другой и отломаем.[/moder]


Сообщение отредактировал _Boroda_ - Воскресенье, 05.06.2016, 21:01
 
Ответить
Сообщение_Boroda_, да, отключил этот блок скрытия строк при активации листа скорости не прибавилось. -:( скорее повлияли так на работу 7ми этажные
формулы "если" на эти 200 строк.
[moder]Вам не кажется, что это прекрасный повод показать сие чудо нам? Может, мы этаж-другой и отломаем.[/moder]

Автор - Sancho
Дата добавления - 05.06.2016 в 20:29
KuklP Дата: Понедельник, 06.06.2016, 13:29 | Сообщение № 4
Группа: Проверенные
Ранг: Старожил
Сообщений: 1994
Репутация: 435 ±
Замечаний: 0% ±

Существенно быстрей будет работать формирование строки адресов и потом скрытие одним махом. Еще вариант быстрей - 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]


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеСущественно быстрей будет работать формирование строки адресов и потом скрытие одним махом. Еще вариант быстрей - 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]

Автор - KuklP
Дата добавления - 06.06.2016 в 13:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Что быстрее будет работать перебор ячеек циклом или ссылка? (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!