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

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

所以,我有一个Excel加载项(VBA,而不是XLL),我们的每个用户都安装了一些额外的UDF等,我们的工作簿需要。

这很好,但现在我需要有一个macros, 每次用户更改任何单元格中的文本时需要执行,而不pipe当前正在使用哪个工作簿。

到目前为止,我已经在我的加载项中创build了一个新的Class模块(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事件,而不需要包含任何macros代码的工作簿。

但它不工作…没有debugging线,当我更改任何工作表上的单元格时,我的DoWorkOnChangedStuff代码没有被调用。

有任何想法吗?

不要在暗淡语句中使用New关键字。 你告诉它在需要的时候实例化这个类,但是你再也不会再引用它,所以这是不需要的。 代替:

 Public MySheetHandler As SheetChangeHandler Sub Auto_Open Set MySheetHandler = New SheetChangeHandler End Sub 

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

得到的信息来自: http : //www.bettersolutions.com/vba/events/creating-application-level.htm,并尝试迪克Kusleika的解决scheme,但没有得到类模块的工作。 经过两天的networkingsearch和放弃之前,我尝试了这一点,为我的工作。 考虑到:“工作簿是服务器生成的SpreadsheetML,它不能包含任何VBA代码”,也是我的要求。

我在我的名为“ApplicationEventClass”的类模块中写了这个:

 Option Explicit Public WithEvents ExcelAppEvents As Application Private Sub Class_Initialize() Set ApplicationClass.ExcelAppEvents = Application End Sub Private Sub ExcelAppEvents_SheetChange(ByVal Sh As Object, ByVal Target As Range) Target.Font.ColorIndex = 5 End Sub 

这在我的模块名为“模块1”:

 Option Explicit Public ApplicationClass As New ApplicationEventClass Sub ConnectEventHandler() On Error Resume Next Set ApplicationClass.ExcelAppEvents = Application End Sub 

而已! 我也希望为你工作。 显然只有在任何工作表中将文本颜色更改为蓝色。