如何在 .BeforeClose() 事件上启动插件代码

How to initiate addin code on .BeforeClose() event

我正在尝试构建我的第一个 excel 插件,它会在满足特定条件后在工作簿关闭时启动代码。条件由 on error go to end 检查。

当我 运行 我的插件时,这整个代码部分似乎没有启动。

此代码当前存储在加载项的 ThisWorkbook 中。

Private WithEvents App As Application

Private Sub Workbook_Open()
    Set App = Application
End Sub

Private Sub App_BeforeClose(Cancel As Boolean)
    Dim wb1 As Workbook
    Dim lastrow As Integer

    On Error GoTo ENDING
    Application.ScreenUpdating = False
    Workbooks.Open (ActiveWorkbook.Sheets("ADDIN-

DONOTTOUCH").Cells(1.1).Value)
    Set wb1 = ActiveWorkbook
    Set ws = wb1.ActiveSheet
    lastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

.....'Other code....

wb1.Save
wb1.Close

Application.DisplayAlerts = False
ActiveWorkbook.Sheets("ADDIN-DONOTTOUCH").Delete
Application.DisplayAlerts = True

Application.ScreenUpdating = True
ENDING:
End Sub

您不应该手动输入事件处理程序过程签名。

Private WithEvents App As Application

WithEvents 变量在代码窗格的左侧下拉列表中添加一个 App 条目:

Select吧。现在展开右侧的下拉菜单...

当您 select 成为 RHS 下拉列表中的成员时,VBE 会自动为您创建处理程序,并保证其有效且格式正确 .然而,如果您凭记忆键入它们,参数排序错误可能会导致很多麻烦。

无论如何,Excel.Application 对象不会公开 BeforeClose 事件,因此虽然您的过程 看起来 像一个事件处理程序,但 LHS 下拉列表说 (General) (而不是事件源对象),并且从未实际调用 "handler"。

但是,由于 ThisWorkbook 是一个加载项,它将与 Excel 一起加载,除非手动卸载,否则将被卸载 also连同 Excel - 因此,如果您在 ThisWorkbook 中处理 Workbook.BeforeClose,那么当 Excel 关闭您的加载项时,您将获得 运行 自定义代码 - 是因为加载项正在卸载,还是因为 Excel 正在关闭