vba - Excel 加载项如何响应任何工作表中的事件?

标签 vba events excel add-in

我们的工作簿是服务器生成的 SpreadsheetML,它不能包含任何 VBA 代码。不幸的是,创建 native Excel 文件或 Excel 2007 XML 文件也不是一个选项。

因此,我有一个 Excel 插件(VBA,而不是 XLL),我们的每个用户都安装它来添加我们的工作簿需要的一些额外的 UDF 等。

这很好用,但现在我需要一个宏,每次用户更改任何单元格中的文本时都需要执行该宏,无论他们当时正在使用什么工作簿。 p>

到目前为止,我已在外接程序中创建了一个新的类模块 (SheetChangeHandler),其中包含以下代码:

Option Explicit
Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Source As Range)
    Debug.Print "Changed"
    On Error GoTo Finish
    App.EnableEvents = False
    DoWorkOnChangedStuff Sh, Source
Finish:
    App.EnableEvents = True
End Sub

在我的外接程序中,我添加了一行来实例化新类:

Public MySheetHandler As New SheetChangeHandler

我的理解是,这应该使 Excel 为所有打开的工作簿发送加载项所有 SheetChange 事件,而这些工作簿不需要包含任何宏代码。

但它不起作用...没有调试行,并且当我更改任何工作表上的单元格时,不会调用我的 DoWorkOnChangedStuff 代码。

有什么想法吗?

最佳答案

请勿在 dim 语句中使用 New 关键字。您告诉它在需要时实例化该类,但随后您再也不会引用它,因此永远不需要它。相反:

Public MySheetHandler As SheetChangeHandler

Sub Auto_Open
   Set MySheetHandler = New SheetChangeHandler
End Sub

Auto_Open 中的那一行(在启动时运行)将实例化该类。

关于vba - Excel 加载项如何响应任何工作表中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858691/

相关文章:

vba - 如何全面管理我的 VBA 用户窗体的属性?

java - 为什么我的 Android 陀螺仪应用程序不会触发任何事件?

vba - 是否可以在With Rg中引用Rg

excel - 定义 X 和 Y 将发生变化的回归范围

css - 如何使用 :focus? 等 CSS 选择器修改 sibling 的属性

vba - 范围有时只接受分号而不是逗号

vba - 使用 VBA 更新 xlam 加载项

excel - 数据透视表自定义聚合函数

excel - 时间值 ("23:50")

javascript - 如何同时触发两个事件: onblur and onclick