Sub App_WorkbookBeforeSave不适用于VBA加载项/ Excel 2010

我将在保存工作簿之前显示一个MessageBox 。 我已经尝试过事件处理程序Sub App_WorkbookBeforeSave()Sub Workbook_BeforeSave但两者都不起作用! 为什么?

有我的小插件:

 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 

UPDATE

我把它们放在属于Microsoft Excel Objects ThisWorkbook模块中

这种function需要…

  • 该代码位于加载项的ThisWorkbook模块中, 或者
  • 使用一个类来保存事件处理代码,同时仍然在ThisWorkbook模块中踢它

无论哪种方式,您都需要创build一个WithEvents应用程序对象的实例,在您创build它之后不直接触摸该对象时,可以捕获事件。

我喜欢第二个选项(更清洁,让你看起来像老板,等等)。 创build一个类并称之为某事。 我喜欢打电话给我的类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模块中join这样的东西…

 Dim objAppLis As New ImAGoodListener Private Sub Workbook_Open() Set objAppLis.App = Application End Sub 

当您的加载项最初打开时,这将启动事件侦听。

或者,如果您为Ribbon使用CustomUI,则使用Ribbon Onload事件来触发开始侦听(当我的事件主要用于function区行为时,我可以这样做,这样我就可以轻松禁用CustomUI xml中的侦听)。

其他一些应用程序使用的事件是:

  • App_SheetActivate
  • App_WorkbookActivate
  • App_WorkbookOpen
  • App_WorkbookBeforeClose
  • App_WorkbookBeforeSave

下面是所有事件列表 ,但是请注意,其中一些是工作簿(事件处理程序以Workbook_事件开始,这对于这类事情不起作用。

Chip在他的网站上对这些事件进行了详细的介绍。