VBA:全局variables在“Workbook_Open”子项后清除
我已经设置了一个应用程序级别的事件类来监视何时新的工作簿被创build/打开,遵循CPearson的指南 。 这工作正常孤立。 但是,它的目的是作为加载项的一部分,我正在写几个其他的子也被称为“Workbook_Open”子,见下面的代码:
Private XLApp As baseCXlEvents Private Sub Workbook_Open() Set XLApp = New baseCXlEvents test AddLocalReferences AddModules AddClassModules Debug.Print "testing" End Sub
所以XLApp
variables在模块范围中作为baseCXlEvents
类被调用。 我已经添加了一个Class_Terminate
事件到这个类,这是在运行Debug.print "testing"
之后触发的,也就是说,在Workbook_Open
子版运行之后, XLApp
被终止。 当我引用子AddLocalReferences
, AddModules
和AddClassModules
,不会发生这种情况。 子test
仅在debugging中打印消息以testing是否调用附加的子消息导致XLApp
被终止。
我目前的“预感”是,添加引用,模块或类模块会被视为“编辑”,导致它被终止,如本MS支持文档中所述 。 但是,如果是这样,为什么XLApp
不会终止,直到子的结尾? 而不是一旦AddLocalReferences
运行。
有什么build议,为什么class结束? 我需要它'保持活着',还需要加载额外的模块和参考插件在workbook_open。 如果需要,可以提供这个代码的更多细节。
我决定添加我的baseCXlEvents类模块的代码 :
Option Explicit Private WithEvents App As Application Private Sub App_NewWorkbook(ByVal Wb As Workbook) MsgBox "New Workbook: " & Wb.Name End Sub Private Sub App_WorkbookOpen(ByVal Wb As Workbook) MsgBox "Workbook opened: " & Wb.Name End Sub Private Sub Class_Initialize() Debug.Print "Initializing baseCXlEvents instance.." Set App = Application End Sub Private Sub Class_Terminate() Debug.Print "Terminating baseCXlEvents instance.." End Sub
那么请尝试使用Auto_Open
从创build类baseCXlEvents
的实例中分离Workbook_Open
事件处理程序的东西(您添加引用等)。
Workbook_Open
首先运行,然后运行Auto_Open
。
注意: baseCXlEvents
Instancing必须设置为Public。
ThisWorkbook类
Public XLApp As baseCXlEvents Private Sub Workbook_Open() Test AddLocalReferences AddModules AddClassModules End Sub
标准模块
Sub Auto_Open() Set ThisWorkbook.XLApp = New baseCXlEvents End Sub