Существуют известные передовые практики для VBA в Excel, которые могут ускорить ваш код.
# 1. Не копируйте и не вставляйте
Функции копирования и вставки (или PasteSpecial ) работают медленно. Примерно в 25 раз быстрее использовать следующее для копирования и вставки значений.
Range("A1:Z100").value = Range("A101:Z200").value
Если вы делаете это таким образом, ваш код, вероятно, будет работать. Возможно, проблема с Mamory, если вы делаете это на многих строках.
# 2. Вычисление
Обычно Excel пересчитывает ячейку или диапазон ячеек при изменении прецедентов этой ячейки или диапазона. Это может привести к слишком частому пересчету вашей книги, что снизит производительность. Вы можете запретить Excel пересчитывать книгу с помощью оператора:
Application.Calculation = xlCalculationManual
В конце кода вы можете вернуть автоматический c режим вычислений с помощью оператора:
Application.Calculation = xlCalculationAutomatic
Помните, однако, что, когда режим расчета xlCalculationManual , Excel не обновляет значения в ячейках. Если ваш макрос полагается на обновленное значение ячейки, вы должны вызвать событие Calculate с помощью метода .Calculate
, например Worksheets(1).Calculate
.
# 3. ScreenUpdating
Каждый раз, когда VBA записывает данные на рабочий лист, он обновляет изображение экрана, которое вы видите. Обновление изображения значительно снижает производительность. Следующая команда отключает обновления экрана.
Application.ScreenUpdating = False
В конце макроса используйте следующую команду, чтобы снова включить обновления экрана.
Application.ScreenUpdating = True
# 4 Игнорировать события
Если у вас есть событие Worksheet_Change
, реализованное для Sheet1 вашей книги. Каждый раз при изменении ячейки или диапазона на Sheet1 запускается событие Worksheet_Change
. Поэтому, если у вас есть стандартный макрос, который управляет несколькими ячейками на листе Sheet1, каждый раз, когда ячейка на этом листе изменяется, ваш макрос должен приостанавливаться на время выполнения события Worksheet_Change
. Вы можете себе представить, как такое поведение замедлит ваш макрос.
Application.EnableEvents = False
В конце кода вы можете вернуть режим EnableEvents
в значение True с помощью оператора:
Application.EnableEvents = True