BeforeClose – это событие, которое возникает перед закрытием Excel-книги. Оно часто используется совместно с процедурой Workbook_Open. К примеру, вы можете использовать Workbook_Open для добавления дополнительной опции в меню, специфичной для данной книги, а затем при закрытии книги использовать Workbook_BeforeClose для удаления этой опции. Таким образом, вы обеспечиваете наличие опции только при открытой книге.
К сожалению, событие Workbook_BeforeClose работает не так, как хотелось бы. Например, если пользователь пытается закрыть несохраненную книгу, Excel отображает запрос на сохранение изменений после того, как событие BeforeClose уже произошло. Если пользователь откажется сохранять изменения, процедура обработки событий завершит свою работу.
Давайте рассмотрим сценарий с пользовательским меню. При открытии книги появляется меню, созданное в Workbook_Open, а при закрытии книги — это меню удаляется в Workbook_BeforeClose. Примеры процедур представлены ниже, каждая вызывает имитацию процедуры, которые выведены в виде сообщения.
Поскольку сообщение "Вы хотите сохранить изменения в файле…" появляется после события Workbook_BeforeClose, то при отмене сохранения Рабочая книга останется открытой, а дополнительный элемент нашего подготовленного «Меню» уже будет удален! И как быть?
Одним из решений этой проблемы может быть внесение запроса на сохранение в саму процедуру Workbook_BeforeClose. Пример:
Давайте разберем процедуру Workbook_BeforeClose:
1. Private Sub Workbook_BeforeClose(Cancel As Boolean)
- - Это объявление процедуры, которая автоматически выполняется перед закрытием книги Excel (Workbook_BeforeClose).
- - Cancel As Boolean - параметр, который используется для возможности отмены действия по закрытию книги.
2. Dim Msg As String
- - Создание переменной Msg типа Stringдля хранения текста сообщения о сохранении.
3. If Me.Saved= False Then
- - Условие проверяет, была ли книга сохранена. Me.Saved - это свойство, которое указывает, сохранена ли книга.
4. Msg= "Хотите сохранить изменения, внесенные в " & Me.Name& "?"
- - Формирование текста сообщения с использованием имени текущей книги (Me.Name).
5. Ans = MsgBox(Msg, vbQuestion + vbYesNoCancel)
- - Отображение диалогового окна с вопросом о желании сохранить изменения. vbQuestion - стиль окна, vbYesNoCancel - опции кнопок "Да", "Нет", "Отмена".
6. Select Case Ans
- - Начало блока выбора в зависимости от ответа пользователя.
7. Case vbYes
- - Если пользователь выбирает "Да", то выполняется следующая команда: Me.Save
- - Это сохраняет изменения в книге.
8. Case vbCancel
- - Если пользователь выбирает "Отмена", то выполняется следующая команда:
- Cancel= True
- Exit Sub
- - Установка Cancel в True отменяет закрытие книги, и процедура завершает свою работу.
9. End Select
- - Завершение блока выбора.
10. End If
- - Завершение условия проверки сохранения.
11. CallУдалениеЭлементовКонтекстногоМеню
- - Вызов другой процедуры (RemoveContextMenuItems), которая отвечает за удаление элементов контекстного меню.
12. Me.Saved= True
- - Установка свойства Saved в True, что фактически говорит Excel о том, что книга сохранена.
В данной процедуре происходит проверка состояния свойства Saved объекта Workbook для определения сохранности текущей рабочей книги. В случае сохраненной книги, процедура переходит к выполнению другой процедуры с названием "УдалениеЭлементовКонтекстногоМеню", после чего происходит закрытие книги. Однако, если в книге есть несохраненные данные, процедура отображает пользователю диалоговое окно, повторяющее сообщение Excel о необходимости сохранения изменений в файле. В этом диалоговом окне доступны три кнопки:
- Да: Книга сохраняется, элемент меню удаляется, и книга закрывается.
- Нет: Свойству Saved объекта Workbook присваивается значение True (при этом данные не сохраняются), элемент меню удаляется, и книга закрывается.
- Отмена: Событие BeforeClose отменяется, и процедура завершается без удаления элементов контекстного меню.