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

ric*_*ent 8 excel events vba add-in excel-vba

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

因此,我有一个Excel加载项(VBA,而不是XLL),我们的每个用户都会安装这些加载项以添加我们的工作簿所需的一些额外的UDF等.

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

到目前为止,我已在我的加载项中创建了一个新的类模块(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
Run Code Online (Sandbox Code Playgroud)

在我的加载项中,我添加了一行来实例化新类:

Public MySheetHandler As New SheetChangeHandler
Run Code Online (Sandbox Code Playgroud)

我的理解是,这应该使Excel 为所有打开的工作簿发送Add-In 所有 SheetChange事件,而不需要包含任何宏代码的工作簿.

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

有任何想法吗?

Dic*_*ika 8

不要在dim语句中使用New关键字.你告诉它在需要的时候实例化类,但是你再也不会再引用它了,所以它永远不需要它.代替:

Public MySheetHandler As SheetChangeHandler

Sub Auto_Open
   Set MySheetHandler = New SheetChangeHandler
End Sub
Run Code Online (Sandbox Code Playgroud)

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