VBA:全局变量在“Workbook_Open”子后清除

时间:2015-07-21 10:36:12

标签: excel vba excel-vba

我已经设置了一个应用程序级事件类来监视按照CPearson's guide创建/打开新工作簿的时间。这在隔离工作正常。但是,它是作为加载项的一部分而写的,其中几个其他子组件也在“Workbook_Open”子组件中调用,参见下面的代码:

Private XLApp As baseCXlEvents

Private Sub Workbook_Open()
    Set XLApp = New baseCXlEvents
    test
    AddLocalReferences
    AddModules
    AddClassModules
    Debug.Print "testing"
End Sub

因此XLApp变量在模块范围内被调用为baseCXlEvents类。我在此类中添加了Class_Terminate事件,这是在Debug.print "testing"运行后触发的,即XLApp子运行后Workbook_Open终止。当我引用子AddLocalReferencesAddModulesAddClassModules时,这不会发生,这与他们的名字所暗示的完全相同。子test仅在调试中打印消息,以测试是否调用其他潜在客户导致XLApp被终止。

我目前的“预感”是添加引用,模块或类模块计为“编辑”,导致它被终止,如this MS Support document中所述。但是,如果是这样,为什么XLApp在子结束之前不会被终止?与AddLocalReferences运行时相反。

为什么课程被终止的任何建议?我需要它“保持活力”,还需要在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

1 个答案:

答案 0 :(得分:0)

然后尝试使用Workbook_Open从创建类baseCXlEvents的实例中分离Auto_Open事件处理程序内容(您添加引用等)。

首先运行

Workbook_Open,然后运行Auto_Open

注意:baseCXlEvents必须将实例化设置为公开。

enter image description here

  

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