Sub App_WorkbookBeforeSave не работает в надстройке VBA / Excel 2010 - PullRequest
2 голосов
/ 07 марта 2012

Я собираюсь показать MessageBox перед сохранением книги.Я пытался с обработчиком событий Sub App_WorkbookBeforeSave() и Sub Workbook_BeforeSave, но оба не работают!Почему?

В дополнении есть мой Sub:

Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, _
                                   ByVal SaveAsUI As Boolean, Cancel As Boolean)
    MsgBox "Good bye! Data is save."
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    MsgBox "Good bye! Data is save."
End Sub

ОБНОВЛЕНИЕ

Я положил их в ThisWorkbook Модули принадлежат Microsoft Excel Objects

1 Ответ

3 голосов
/ 05 сентября 2012

Для работы такого типа требуется ...

  • Код, который должен находиться в модуле 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_ событий, которые не будут работать для этого такие вещи.

Чип подробно рассказывает о подобных событиях на своем сайте здесь .

...