Для работы такого типа требуется ...
- Код, который должен находиться в модуле ThisWorkbook надстройки, ИЛИ
- Использование класса для хранения кода обработки событий, в то же время используя его в модуле ThisWorkbook
В любом случае вам нужно создать экземпляр WithEvents Объект приложения, который, хотя вы не касаетесь объекта непосредственно после его создания, позволяет захватывать события.
Мне нравится второй вариант (чище, заставляет вас выглядеть боссом и т. Д.). Создайте класс и назовите его как-нибудь. Мне нравится называть мой класс ImAGoodListener . В классе включите соответствующие Subs для любых событий приложения, которые вы хотите использовать
Public WithEvents App As Application
Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
On Error Resume Next
MsgBox "Good bye!"
End Sub
С аргументами вы можете делать классные и вредные вещи, такие как предотвращение сохранения книги ...
(мне нравится On Error Resume Next для этого, поэтому мы не рискуем не позволить пользователю сохранить его / ее рабочую книгу, если наш код выйдет из строя)
В модуле ThisWorkbook поставить что-то вроде этого ...
Dim objAppLis As New ImAGoodListener
Private Sub Workbook_Open()
Set objAppLis.App = Application
End Sub
Это запустит прослушивание события при первом открытии надстройки.
В качестве альтернативы, если вы используете CustomUI для ленты, вы используете событие загрузки ленты для запуска начала прослушивания (я делаю это, когда мои события используются в основном для поведения ленты, поэтому я могу легко отключить прослушивание в CustomUI xml ).
Некоторые другие события использования приложения:
- App_SheetActivate
- App_WorkbookActivate
- App_WorkbookOpen
- App_WorkbookBeforeClose
- App_WorkbookBeforeSave
Вот список всех событий , но обратите внимание, что некоторые из них являются рабочими книгами (обработчики событий начинаются с Workbook_ событий, которые не будут работать для этого такие вещи.
Чип подробно рассказывает о подобных событиях на своем сайте здесь .