Рубрикатор
|
Ускоряем работу макроса в ExcelЧем больше познаём мы макросы, тем интересней выгледят наши программы. А бывает, что их выполнение происходит очень долго, при сложных и долгих математических расчётах или составлении каких-то отчётов и табилц. В ходе выполнения макроса на мониторе происходит мелькание различных окон, открытие и закрытие книг, и прочая светомузыка. Для того чтобы этого не происходило, и чтобы время выполнение нашего макроса сократить раз в 100, можно воспользоваться командами описанные ниже. Application.ScreenUpdatingApplication.ScreenUpdating - отвечает за обновление экрана и может принимать два значения - False (обновление экрана отключено) и True (обновление экрана включено). В коде это обычно прописывается в том месете, где происходит мелькание различных окон или видно как производится расчёт и происходит заполнение таблицы. Ниже показан пример заполнения ячеек, и данную команду вставили в начало и конец макроса, т.е. сначала отключаем обновление экрана, а потом включаем обновление экрана. При такой записи мы не увидим процесс заполнения ячеек. А вот если убрать эти команды, то мы сможем наблюдать за процессом заполнения этих ячеек. Sub Primer() Application.ScreenUpdating = False For a = 1 To 100 For b = 1 To 100 Cells(a, b) = "Пример" Next b Next a Application.ScreenUpdating = True End Sub Application.CalculationApplication.Calculation - отвечает за автоматический расчёт в книге Excel и может принимать два значения - xlCalculationManual(ручной расчёт) и xlCalculationAutomatic (автоматический расчёт - по умолчанию установлен в Excel). Но тут есть одна осторожность, если вы перевели Excel в ручной расчёт, и в макросе произошла ошибка и он так и не выполнился до конца - т.е. не включился автоматический расчёт формул, то все ваши вычисления в дальнейшем будут в пустую. Так как формулы не будут автоматически пересчитываться, Excel превратиться в обычную таблицу. Но данная команда играет одну из основных ролей в быстроте выполнеия макроса. Вообщем лучше сделать код, который исключает ошибки, чтобы макрос полюбому выполнился и Excel перевёлся в автоматический расчёт. Если у Вас имеется большая таблица с многочисленными формулами, и часть вычислений вы производите при помощи макросов, то для быстроты выполнения расчётов разумно в начало и конец кода поместить команду Application.Calculation. Sub Primer2() Application.Calculation = xlCalculationManual ................... ................... ................... Application.Calculation = xlCalculationAutomatic End Sub Application.EnableEventsApplication.EnableEvents - команда отвечающая за выполнение сторонних событий. Эту команду мы уже затрагивали в этом уроке. И она также может принимать два значения - это False (отключить собтие) и True (включить выполнение промежуточных событий). Но теперь ещё известно, что она играет значительную роль в скорости выполнения некоторых кодов макроса. Пример можно взять из Урока №23. Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target.Cells = "Привет" Application.EnableEvents = True End Sub ActiveSheet.DisplayPageBreaksActiveSheet.DisplayPageBreaks - отображение границ листа. Может принимать два значения - False (отключить отображение границ) и True (включить отображение границ). Не знаю как это помогает на скорости выполнения макроса, лично я этого не ущутил, но некоторые говорят, что помогает. Я вообще не люблю когда отображаются границы листа, мне кажется, что это нужно только при распечатке. Помещать этот код можно в начало и конец макроса. Private Sub Worksheet_Change(ByVal Target As Range) ActiveSheet.DisplayPageBreaks = False ......................... ......................... ......................... ActiveSheet.DisplayPageBreaks = True End Sub Application.DisplayStatusBarApplication.DisplayStatusBar - строка состояния. Может принимать два значения - False (отключить строку состояния) и True (включить строку состояния). При выполнении макросов в строке состояния отображаются все происходяще события. Для того чтобы не тратить время на просчёт событий и прорисовку их в статусбаре, отключаем её на время выполнения макроса, и включаем её когда макрос закончил выполняться. Private Sub Worksheet_Change(ByVal Target As Range) Application.DisplayStatusBar = False ......................... ......................... ......................... Application.DisplayStatusBar = True End Sub Application.DisplayAlertsApplication.DisplayAlerts - команда, отвечающая за события в Excel. Может принимать два значения - False (отключаем запросы Excel) и True (включаем события Excel). Это чень интересная и полезная команда при помощи, которой можно отключить запросы Excel, например, чтобы он не спрашивал нужно ли сохранить изменения в книге, или отключить запрос на совместимость версий Excel. Ниже приведён пример, в котором книга закрывает сама себя, при этом независимо от того внесли вы изменения или нет в книгу, при закрытии книги вам не поступит запрос "Сохранить изменения", а книга просто закроется без сохранения и уведомления пользователя. Sub Primer() Application.DisplayAlerts = False ThisWorkbook.Close Application.DisplayAlerts = True End Sub Глобальное ускорениеИз всего выше сказанного можно сделать вывод, что для ускорения работы макроса можно воспользоваться нужными нам командами, теми которые подходят в нашем случае. Бывает, что код очень сложный и включает в себе различные математические и другие операции и использовать можно несколько команд сразу как показано на этом примере: sub Primer() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Application.DisplayStatusBar = False Application.DisplayAlerts = False ......................... ......................... ......................... ......................... Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.DisplayStatusBar = True Application.DisplayAlerts = True End Sub
|
Поиск
|
||