MENU
Главная » Статьи » Без категории

Ускоряемся! Оптимизация кода и время работы макроса.
Выключаем:
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False 'отслеживание событий на листе
    ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False

При необходимости используем:
ActiveSheet.Calculate                    'пересчитает активную страницу (формулы на ней)
Application.Calculate                     'пересчитает все открытые книги
range.Calculate         'пересчет указанного диапазона и связей внутри указанного диапазона
range.CalculateRowMajorOrder 'пересчет указанного диапазона слева-направо и сверху-вниз один раз


Включаем в конце макроса:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayStatusBar = True

Алгоритмическая оптимизация:
 1. Заменять работу с ячейками работой с массивами:
Присвоили массив:
arr = Cells(1, 1).Resize(999, 10).Value
провели вычисления и далее выгружаем массив на лист:

Cells(1, 1).Resize(999, 10).Value = arr
 
 2. Менять Iff, switch, shoose на if...else
 3. При проверке на содержание данные использовать Len(str)=0 вместо str = "".
 4. При сравнении ТЕКСТА применять StrComp(str1,str2) (3-й параметр vbTextCompare, если нужно с учетом регистра),  а не "Петя" <> "Женя".
 5. For ..Next вместо Do ... Loop.
 6. Конкретней присваивать типы, не Variant, а Long или arr() as string, т.е. массив с данными, не Object, а Range или Worksheet.
 7. For each obj in collection - работает быстрее чем for i=1 to lastrow ... next
 
' пишем Call Accelerator_Sub(True) - если надо ускорится, False - если вырубаем обратно
Sub Accelerator_Sub(on_off As Boolean)
Static Manual_calc As Integer
If on_off = True Then
ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayStatusBar = False
        Manual_calc = Application.Calculation
        .Calculation = xlCalculationManual
    End With
Else
    With Application
        .DisplayAlerts = True
        .ScreenUpdating = True
        .EnableEvents = True
        .DisplayStatusBar = True
        .Calculation = Manual_calc
    End With
End If
End Sub

 
Категория: Без категории | Добавил: clownsaround (31.03.2017)
Просмотров: 531 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar