FormulaCamp
Пройдено
13. VBA и макросы · События и формы · 20 мин

4. VBA: события книги и листа

Урок 4 из 7
    Теория урока

    Событие — процедура, которую Excel вызывает сам: при открытии книги, изменении ячейки, перед сохранением. Имя и место процедуры строго заданы. Проще всего создать её через списки над окном кода: слева объект (Workbook или Worksheet), справа событие.

    • модуль ЭтаКнига (ThisWorkbook): Workbook_Open, Workbook_BeforeSave, Workbook_BeforeClose;
    • модуль листа: Worksheet_Change(ByVal Target As Range) — пользователь изменил ячейки, Target — какие именно; Worksheet_SelectionChange — выделение сменилось; Worksheet_Calculate — лист пересчитался.
    ' модуль листа «Заявки»
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Intersect(Target, Range("C2:C500")) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        Target.Offset(0, 1).Value = Now        ' D: когда изменили статус
        Application.EnableEvents = True
    End Sub
    
    ' модуль ЭтаКнига
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        If Worksheets("Заявки").Range("B2").Value = "" Then
            MsgBox "Заполните ответственного в B2"
            Cancel = True
        End If
    End Sub

    Разбор: Intersect возвращает пересечение диапазонов. Если изменили ячейку вне C2:C500, пересечения нет (Is Nothing) — выходим. Запись даты в D сама является изменением листа, и без EnableEvents = False событие вызвало бы само себя снова. Cancel = True в BeforeSave отменяет сохранение.

    Важно: Worksheet_Change не срабатывает при пересчёте формул — для этого есть Worksheet_Calculate. События работают, только если макросы в книге разрешены. Изменения, сделанные макросом, нельзя отменить через Ctrl+Z.

    Тренажёр не выполняет макросы и скрипты. Код из урока запускайте в настольном Excel (VBA) или в Excel для Интернета (Office Scripts). Здесь вы учитесь читать код и проверяете себя формулами и тестом.

    Проверьте себя

    1. Где должна находиться процедура Workbook_Open, чтобы она запускалась при открытии книги?
    2. В модуле ЭтаКнига написано Private Sub Workbook_Opne(). Что будет при открытии файла?
    3. Что делает строка If Intersect(Target, Range("C2:C500")) Is Nothing Then Exit Sub ?
    4. Worksheet_Change пишет значение в соседнюю ячейку, и Excel зависает. Какую строку добавить перед записью?
    5. В Workbook_BeforeSave выполнилась строка Cancel = True. Что произойдёт?
    6. В A1 формула =B1*2. Пользователь меняет B1 на листе. Для какой ячейки сработает Worksheet_Change?