Свойство Application.EnableEvents в VBA Excel. Управление механизмом обработки событий. Примеры использования свойства Application.EnableEvents.
Свойство Application.EnableEvents
Application.EnableEvents – это инструмент управления реакцией Excel на события. Оно позволяет временно отключать или включать обработчики событий, связанные с листами, книгами, диаграммами и самой программой.События в VBA Excel
События — это действия пользователя или системы, на которые Excel может реагировать автоматически, выполняя заранее написанный код. Например:
Worksheet_Change— срабатывает при изменении содержимого ячейки.Workbook_Open— срабатывает при открытии книги.BeforeSave— срабатывает перед сохранением книги.
Обычно эти обработчики полезны, но иногда они мешают: ваш собственный код может изменять ячейки, и каждое такое изменение запускает событие Worksheet_Change, которое может выполнять ненужные действия, входить в бесконечный цикл или сильно замедлять работу.
По умолчанию Application.EnableEvents = True, то есть Excel автоматически реагирует на все события и запускает соответствующие макросы.
Синтаксис свойства
|
1 |
Application.EnableEvents = [True | False] |
Значения свойства:
True(по умолчанию) — cобытия включены → все обработчики событий выполняются.False— cобытия отключены → Excel не будет вызывать ни один обработчик события, даже если условия для него выполняются.
Зачем отключать события
Основная цель использования свойства Application.EnableEvents = False (режим отключения событий) — избежать зацикливания и повысить производительность при выполнении кода.
Важно: отключение событий действует глобально на всё приложение Excel, а не только на текущую книгу. Поэтому после отключения событий обязательно включите их обратно.
Если вы забудете вернуть значение свойства в True, события перестанут работать во всём Excel.
То же самое может произойти при аварийном завершении программы из-за ошибки. Всегда используйте обработчик ошибок On Error GoTo, чтобы гарантировать включение событий даже при сбое.
|
1 2 3 4 5 6 7 8 9 |
Sub Пример() On Error GoTo ExitHandler Application.EnableEvents = False ' Ваш код ExitHandler: Application.EnableEvents = True End Sub |
Примеры с Application.EnableEvents
Предотвращение рекурсии
Допустим, у вас есть обработчик события изменения ячейки:
|
1 2 3 4 |
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A2:K30")) Is Nothing Then Range("A1").Value = Target.Value End Sub |
Событие должно при изменении любой ячейки в диапазоне A2:K30 копировать её значение в ячейку A1.
Проблема: изменение A1 внутри обработчика снова вызывает Worksheet_Change → возникает бесконечный цикл. У меня, при проведении тестов, Excel самопроизвольно закрывался.
Решение с помощью свойства Application.EnableEvents:
|
1 2 3 4 5 6 7 8 9 10 11 |
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ExitHandler Application.EnableEvents = False If Not Intersect(Target, Range("A2:K30")) Is Nothing Then Range("A1").Value = Target.Value End If ExitHandler: Application.EnableEvents = True End Sub |
Для похожей цели свойство Application.EnableEvents используется в коде суммирования чисел в одной ячейке, где оно предотвращает повторный вызов события Worksheet_Change.
Предотвращение нежелательных диалогов
Если у вас есть обработчик события Workbook_BeforeSave, который перед сохранением книги проверяет данные и требует подтверждения, вы можете временно его отключить, когда выполняете программное сохранение.
|
1 2 3 4 5 6 7 |
Sub SilentSave() On Error GoTo ExitHandler Application.EnableEvents = False ThisWorkbook.Save ExitHandler: Application.EnableEvents = True End Sub |
Ускорение массовых операций
Ускорение макроса вместе с другими способами оптимизации:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub ПримерУскорения() On Error GoTo ExitHandler ' Отключаем всё, что тормозит Excel Application.ScreenUpdating = False ' Не обновлять экран Application.Calculation = xlCalculationManual ' Не пересчитывать формулы Application.EnableEvents = False ' Не вызывать события ' ... Здесь ваш код, который обрабатывает очень много ячеек ... ExitHandler: ' Возвращаем всё как было Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub |
Краткие выводы
Зависимость свойства от значения
Зависимость свойства Application.EnableEvents от его значения:
| Свойство | Значение | Эффект |
|---|---|---|
| EnableEvents | True | События работают |
| EnableEvents | False | События отключены |
Когда использовать свойство
Используйте Application.EnableEvents = False, когда:
- Изменяете ячейки внутри обработчиков событий.
- Выполняете массовые изменения данных.
- Запускаете макросы, которые могут триггерить (вызывать) события.
Когда не стоит использовать
- Если ваш код не взаимодействует с событиями.
- Если вы не можете проконтролировать возврат значения
Application.EnableEventsвTrue.