应用程序事件
我想控制我的所有应用程序事件,并发现使用WithEvents
将提供该解决方案。我读了cpearson的一篇文章的Application Events In A Dedicated Class Module部分。应用程序事件
我想弄清楚的是:你需要有一个ThisWorkbook
事件过程,对于你创建的每个类事件过程吗?
在ThisWorkbook
模块:
Private ExcelEvents As CApplicationEvents
Private Sub Workbook_Open()
Set ExcelEvents = New CApplicationEvents
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Set ExcelEvents = New CApplicationEvents
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Set ExcelEvents = New CApplicationEvents
End Sub
和CApplicationEvents
类模块中:
Private WithEvents appExcel As Application
Private Sub appExcel_SheetActivate(ByVal Sh As Object)
Debug.Print "worked!"
End Sub
Private Sub appExcel_SheetCalculate(ByVal Sh As Object)
Debug.Print "calculating... !"
End Sub
Private Sub appExcel_WorkbookOpen(ByVal Wb As Workbook)
Debug.Print "workbook name:" & Wb.Name
End Sub
Private Sub Class_Initialize()
Set appExcel = Application
End Sub
我原本以为ThisWorkbook
模块中的Workbook_Open
程序将允许类中的任何事件过程的创建模块,但是在ThisWorkbook
模块中没有创建相应的事件过程,我的类模块中的事件代码不会触发并运行。
我澄清之后基本上,如果我我的类模块中创建一个新appExcel_WorkbookBeforeClose
事件过程,是那么还必须先创建ThisWorkbook
模块中的Workbook_BeforeSave
过程中,再次声明Set ExcelEvents = New CApplicationEvents
?如果是这样,在这种情况下使用类模块有什么好处?这似乎是对我的代码重复。
不确定你的意思是什么,但在类里面的appExcel需要设置为应用程序。像这样
Private Sub Workbook_Open()
Set c = New cApplication
c.INITIALISE Application
End Sub
,并在课堂上
Option Explicit
Private WithEvents app As Excel.Application
Public Sub INITIALISE(x As Excel.Application)
Set app = x
End Sub
希望这有助于我没有完全理解后。
THanks
Nathan。
我在我的类模块中有一个'Class_Initialize'过程,所以当变量'ExcelEvents'被设置为'ThisWorkbook'模块中类的一个实例时,它会自动启动这个类。我更想知道是否需要为类模块和ThisWorkbook模块中的每个事件都有额外的过程。 –
你不需要再次实例化Set ExcelEvents = New CApplicationEvents
。您只需创建一次并在其中保存参考,即Workbook_Open
。
只要你按住该实例的引用,它会存活,但如果VBA项目卸载,或者:
在代码中的某处明确
End
声明(这是不太可能)或者如果代码在调试期间中断;例如未处理的错误被抛出
或手动停止执行,同时在调试器
在这些情况下,你松散的实例。你可以通过询问?ThisWorkbook.ExcelEvents Is Nothing
验证它在即时窗口当实例丢失,你并不需要退出并重新打开工作簿,你可以只是再次劳克,手动的Workbook_Open
程序(请将光标在里面,然后按F5
)。该实例将被重新创建,您可以继续正常开发会话。
p.s.以上推理实际上适用于所有全局变量。每当项目因上述任何原因而卸载时,它们都将被重置:字符串为""
,数字为0
,对象为Nothing
...但您可以重新创建或重新创建它们或将它们设置为即时窗口或启动任何一段代码。
不知道为什么,但只是退出Excel和回去已经解决了这个问题。我现在可以将新的事件过程添加到类模块中,只需在“ThisWorkbook”模块中具有“Workbook_Open”事件过程。 –
在ThisWorkbook模块中,您应该将ExcelEvents声明为Public,而非private。 –