Найти в Дзене
Макрос решает

Макрос на страже порядка: как запретить сохранение книги без заполненных данных и подтвердить успех

Есть в Excel магия, которую не видно, но она работает как надежный сторож у ворот. Речь пойдёт о событиях Workbook_BeforeSave и Workbook_AfterSave. Эти две субстанции VBA заставят вашу книгу думать, прежде чем сохраниться, и отчитаться, когда сохранение прошло успешно. Сегодня мы шаг за шагом научим книгу быть ответственной:
— не сохраняться, пока не заполнены ключевые ячейки;
— и радостно сообщать об успешной сохранности. Настраивайтесь, будет полезно и на практике, и в душе. Событие Workbook_BeforeSave — это то, что срабатывает перед сохранением. А это значит: именно здесь мы можем проверить, всё ли заполнено и решать, разрешать ли сохранение. Представьте: есть лист с данными, и в шести ячейках по строке M (пусть это M5, M7, M9, M11, M13, M15) должны быть внесены значения. Пока хоть одна пуста — никакого сохранения! Вот макрос: │ Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
│ _ Dim filledCount As Long_
│ _ filledCount = Application.WorksheetFuncti
Оглавление

Есть в Excel магия, которую не видно, но она работает как надежный сторож у ворот. Речь пойдёт о событиях Workbook_BeforeSave и Workbook_AfterSave. Эти две субстанции VBA заставят вашу книгу думать, прежде чем сохраниться, и отчитаться, когда сохранение прошло успешно.

Сегодня мы шаг за шагом научим книгу быть ответственной:

— не сохраняться, пока не заполнены ключевые ячейки;

— и радостно сообщать об успешной сохранности.

Настраивайтесь, будет полезно и на практике, и в душе.

🛡 Сначала — запрет на сохранение. Workbook_BeforeSave

Событие Workbook_BeforeSave — это то, что срабатывает перед сохранением. А это значит: именно здесь мы можем проверить, всё ли заполнено и решать, разрешать ли сохранение.

Представьте: есть лист с данными, и в шести ячейках по строке M (пусть это M5, M7, M9, M11, M13, M15) должны быть внесены значения. Пока хоть одна пуста — никакого сохранения!

Вот макрос:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

│ _ Dim filledCount As Long_

│ _ filledCount = Application.WorksheetFunction.CountA(_

│ _  Worksheets("Data").Range("M5, M7, M9, M11, M13, M15"))_

│ _ If filledCount < 6 Then_

│ _  MsgBox "Рабочая книга не будет сохранена," & vbCrLf & _

│ _  "пока все необходимые ячейки не будут заполнены.", vbExclamation_

│ _  Cancel = True_

│ _ End If_

End Sub

Что здесь происходит:

  • CountA считает непустые ячейки.
  • Если их меньше 6 — значит, что-то забыли.
  • Сохраняться запрещаем (Cancel = True).
  • А пользователю вежливо, но строго говорим, что он должен сначала закончить начатое.

🎯 Практический совет

Убедитесь, что лист, в котором проверяются данные, точно называется "Data". Ошибка в названии — и весь макрос встанет. Лучше проверьте в свойствах вкладки (или переименуйте аккуратно).

💬 Пока вы читаете, нажмите «Подписаться» — впереди ещё десятки статей по VBA, которые превратят Excel в искусственный интеллект на минималках. А ещё будет приятно, если напишете в комментарии, какие проверки вы хотите встроить перед сохранением.

🌞 А теперь — сообщение об успехе. Workbook_AfterSave

Как только файл успешно сохранился, на сцену выходит Workbook_AfterSave. Его задача — проанализировать, всё ли прошло как надо, и выдать сообщение.

Вот как это выглядит:

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

│ _ If Success Then_

│ _  MsgBox "Рабочая книга была успешно сохранена.", vbInformation_

│ _ End If_

End Sub

Этот макрос максимально прост:

  • Переменная Success автоматически содержит значение True, если файл действительно сохранился.
  • Нам остаётся только порадовать пользователя сообщением, что его усилия не пропали зря.

Обратите внимание, как изящно используется логика:

If Success Then ...

То есть без лишнего сравнения If Success = True Then — потому что Success уже булево значение. Маленькая эстетика, но приятно.

🔗 Связка BeforeSave + AfterSave = Ответственный Excel

Эти два макроса — как вахтёры на проходной:

  • Один не пускает, если не всё готово.
  • Второй кивает и говорит: «Прошло успешно».

Важно! Оба макроса работают только в ThisWorkbook. То есть вставлять их нужно в модуль «ЭтаКнига» (в редакторе VBA, в левой панели Project Explorer).

💼 Где это пригодится?

  • Отчёты отдела продаж — пока не внесены данные по всем филиалам, файл не уйдёт в архив.
  • План-факт-анализ — пусть сначала заполнят фактические показатели, а уж потом нажимают "Сохранить".
  • Бюджетирование — избегаем ситуаций, когда кто-то сохранил полупустой файл и через месяц никто не понял, что происходит.

🔁 Заключение: Excel с характером

Добавив всего два макроса, вы превращаете бездушный файл в почти живой механизм с внутренним контролем. Такой подход дисциплинирует не только таблицы, но и пользователей.

А если вам интересно продолжать разбираться в мире событий Excel — у нас целый сериал впереди. Подпишитесь, и вы не пропустите ни одного урока.

✍️ Напишите в комментариях:
Какие ещё проверки вам хотелось бы автоматизировать? Может быть — чтобы нельзя было закрыть файл без резервной копии? Или чтобы при сохранении отправлялось письмо?