【问题标题】:Sub App_WorkbookBeforeSave doesn't work on VBA Add-in/Excel 2010Sub App_WorkbookBeforeSave 不适用于 VBA 加载项/Excel 2010
【发布时间】:2012-03-07 03:52:25
【问题描述】:

我将在保存工作簿之前显示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 的模块中

【问题讨论】:

  • 第二段代码看起来不错,检查是否启用了宏并且您没有禁用事件。
  • 您的Workbook_BeforeSave 为我工作...您确定将它放在ThisWorkbook 模块中吗?
  • 是的,我被放在ThisWorkbook 属于Microsoft Excel Objects
  • 如果 Workbook_BeforeSave 在插件的工作簿模块中,那么在保存另一个工作簿时它不会被触发。这就是你想要捕捉的吗?如果是这样,那么您需要设置一些应用程序级事件。 Google for“Excel 应用程序事件”
  • @Tim 你是对的!谢谢!

标签: excel vba event-handling subroutine


【解决方案1】:

这种功能需要...

  • 加载项的 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 用于功能区,则使用功能区 Onload 事件来触发开始侦听(当我的事件主要用于功能区行为时,我会这样做,这样我就可以在 CustomUI xml 中轻松禁用侦听)。

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

  • App_SheetActivate
  • App_WorkbookActivate
  • App_WorkbookOpen
  • App_WorkbookBeforeClose
  • App_WorkbookBeforeSave

这是一个 list of all events,但请注意其中一些是工作簿(事件处理程序以 Workbook_ 事件开头,这不适用于此类事情。

Chip 在他的网站 here 上详细介绍了此类事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多