События и их обработка в VBA. Урок №42

События и их обработка в VBA. Урок №42

События в VBA (Visual Basic for Applications) – это триггеры, которые срабатывают при выполнении определённых действий пользователем или системой. Они позволяют программам реагировать на изменения в рабочих книгах, листах, диапазонах данных и даже формах.

Обработка событий – это важная часть программирования на VBA, так как она делает код интерактивным и гибким.

Основные события в VBA

В приложениях Microsoft Office существуют события, которые одинаково работают во всех программах. Например, события Open (открытие документа или книги) и BeforeClose (перед закрытием) доступны как в Word, так и в Excel, и позволяют запускать код при выполнении этих действий.

Однако, есть и уникальные события, которые доступны только в конкретных приложениях. Например, событие SheetChange в Excel срабатывает при изменении значений на листе, но такое событие отсутствует в Word, поскольку в текстовом процессоре нет понятий листов и ячеек. Аналогично, в Word существуют события, связанные с обработкой текста, которых нет в Excel.

Таким образом, одни события являются универсальными для всех приложений MS Office, а другие зависят от специфики каждой отдельной программы.

Основные события в Excel VBA

  1. События рабочей книги:
    • Workbook_Open – срабатывает при открытии книги.
    • Workbook_BeforeClose – срабатывает перед закрытием книги.
    • Workbook_SheetChange – срабатывает при изменении значений в любом листе книги.
  2. События листа:
    • Worksheet_Change – срабатывает при изменении значений в ячейках листа.
    • Worksheet_SelectionChange – срабатывает при изменении выделенной области.

Основные события в Word VBA

Document_Close – срабатывает при закрытии документа. Это событие полезно для выполнения завершающих действий, таких как сохранение данных или предупреждение пользователя о несохраненных изменениях.

Document_New – срабатывает при создании нового документа. Используется для инициализации каких-либо данных или настройки документа в момент его создания.

Document_ContentChange – срабатывает при изменении содержимого документа, когда пользователь добавляет или удаляет текст, изображения или другие элементы. Это событие полезно для контроля за изменениями текста в реальном времени.

Document_ContentControlOnExit – срабатывает при выходе пользователя из элемента управления содержимым (например, текстового поля или раскрывающегося списка). Это событие может быть полезным для проверки или обработки данных, введенных в эти элементы.

Document_BeforePrint – срабатывает перед печатью документа. Это событие можно использовать для подготовки документа перед его печатью, например, обновления полей или добавления отметок.

Document_WindowActivate – срабатывает, когда активируется окно документа. Полезно для выполнения каких-либо действий, когда пользователь переключается между окнами разных документов.

Document_WindowDeactivate – срабатывает, когда окно документа становится неактивным, например, при переключении на другое окно или приложение.

Как работают события в VBA

Обработка событий в VBA заключается в написании специального кода, который будет выполняться, когда происходит событие. Код помещается в модули, ассоциированные с объектами, которые могут инициировать события, например, в модули листов или книг.

Чтобы продемонстрировать, как это работает, рассмотрим один из популярных примеров – событие Excel Worksheet_Change.

Пример: Обработка события изменения ячейки

Предположим, мы хотим, чтобы при изменении значения в любой ячейке столбца A автоматически рассчитывалась и записывалась сумма всех значений столбца A в ячейку B1. Для этого:

  1. Откройте редактор VBA (Alt + F11).
  2. Найдите лист, для которого нужно обработать событие (например, Sheet1 или Лист1), и откройте его модуль.
  3. Напишите следующий код:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Проверяем, изменяется ли ячейка в столбце A
    If Not Intersect(Target, Me.Columns("A")) Is Nothing Then
        ' Если да, то пересчитываем сумму столбца A
        Dim cell As Range
        Dim sumA As Double
        sumA = 0
        
        ' Проходим по всем ячейкам в столбце A
        For Each cell In Me.Range("A1:A" & Me.Cells(Me.Rows.Count, "A").End(xlUp).Row)
            If IsNumeric(cell.Value) Then
                sumA = sumA + cell.Value
            End If
        Next cell
        
        ' Записываем сумму в ячейку B1
        Me.Range("B1").Value = sumA
    End If
End Sub

Зачем использовать события в VBA?

Обработка событий полезна, если необходимо автоматизировать реакции на действия пользователя. Например:

  • Обновление данных при вводе новой информации.
  • Выполнение проверок и предупреждений при вводе неверных данных.
  • Автоматизация задач, таких как сохранение книги (документа) при её закрытии или пересчёт формул при изменении диапазона.

Рекомендации по работе с событиями в VBA

  1. Оптимизация. Некоторые события могут срабатывать очень часто (например, при каждом изменении выделения или изменении ячеек). Чтобы предотвратить замедление работы книги, старайтесь минимизировать объём кода внутри обработчиков событий.
  2. Отключение обработки событий. Если вам нужно временно отключить события (например, при массовых изменениях данных), используйте следующую команду:
Application.EnableEvents = False

После выполнения изменений обязательно включите события обратно:

Application.EnableEvents = True

Main Menu