子应用程序保存前工作簿不';t使用VBA加载项/Excel 2010

子应用程序保存前工作簿不';t使用VBA加载项/Excel 2010,excel,vba,event-handling,subroutine,Excel,Vba,Event Handling,Subroutine,在保存工作簿之前,我将显示一个消息框。我已尝试使用事件处理程序子应用程序\u WorkbookBeforeSave()和子工作簿\u BeforeSave,但两者都不起作用!为什么? 附件中有我的Sub: Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, _ ByVal SaveAsUI As Boolean, Cancel As Boolean) Msg

在保存工作簿之前,我将显示一个
消息框
。我已尝试使用事件处理程序
子应用程序\u WorkbookBeforeSave()
子工作簿\u 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
更新


我把它们放在
这个工作簿中
模块属于
Microsoft Excel对象

这种功能需要

  • 外接程序的此工作簿模块中的代码,
  • 使用类保存事件处理代码,同时仍在ThisWorkbook模块中启动它
无论采用哪种方式,您都需要创建WithEvents应用程序对象的实例,尽管在创建对象后您不会直接触摸该对象,但它可以捕获事件

我喜欢第二种选择(更干净,让你看起来像个老板,等等)。创建一个类,并将其命名为。我喜欢称我的班级为“我的好听众”。在类中,为您想要使用的任何应用程序事件包括适当的子类

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
有了这些参数,你可以做一些很酷的恶作剧,比如阻止工作簿被保存

(我喜欢下一步的错误恢复,这样我们就不会冒不允许用户保存其工作簿的风险,因为我们的代码可能会出错)

本工作簿模块中,放入如下内容

Dim objAppLis As New ImAGoodListener

Private Sub Workbook_Open()
    Set objAppLis.App = Application
End Sub
这将在最初打开外接程序时启动事件侦听

或者,如果正在为功能区使用CustomUI,则可以使用功能区Onload事件触发侦听的开始(当我的事件主要用于功能区行为时,我会这样做,以便可以轻松禁用CustomUI xml中的侦听)

其他一些应用程序使用事件包括:

  • 应用程序启动
  • 应用程序\u工作簿激活
  • 应用程序\u工作簿打开
  • 关闭前的应用程序\u工作簿
  • 保存前应用程序\u工作簿
这里有一个,但请注意,其中一些是工作簿(事件处理程序以工作簿事件开始,对于此类事件不起作用)


Chip在他的网站上详细介绍了这类事件

第二段代码看起来不错,请检查宏是否已启用,以及您是否已禁用事件。在保存
之前,您的
工作簿对我有效……您确定您将其放入
此工作簿
模块中了吗?是的,我将其放入了
此工作中book
属于
Microsoft Excel对象
如果保存前的工作簿位于加载项的工作簿模块中,则在保存另一个工作簿时不会触发该工作簿。这就是您试图捕获的内容吗?如果是,则需要设置一些应用程序级事件。谷歌搜索“Excel应用程序事件”@蒂姆:你说得对!谢谢!