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 

所以XLAppvariables在模块范围中作为baseCXlEvents类被调用。 我已经添加了一个Class_Terminate事件到这个类,这是在运行Debug.print "testing"之后触发的,也就是说,在Workbook_Open子版运行之后, XLApp被终止。 当我引用子AddLocalReferencesAddModulesAddClassModules ,不会发生这种情况。 子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