gpt4 book ai didi

VBA:全局变量在 'Workbook_Open' sub 后被清除

转载 作者:行者123 更新时间:2023-12-02 19:12:32 24 4
gpt4 key购买 nike

我已经设置了一个应用程序级事件类来监视何时创建/打开新工作簿,方法是 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 运行后立即相反。

对于类(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 将 Workbook_Open 事件处理程序内容(在其中添加引用等)与类 baseCXlEvents 实例的创建分开

Workbook_Open 首先运行,Auto_Open 然后运行。

注意:baseCXlEvents 实例化必须设置为 Public。

enter image description here

ThisWorkbook class

Public XLApp As baseCXlEvents

Private Sub Workbook_Open()

Test
AddLocalReferences
AddModules
AddClassModules

End Sub

Standard module

Sub Auto_Open()
Set ThisWorkbook.XLApp = New baseCXlEvents
End Sub

关于VBA:全局变量在 'Workbook_Open' sub 后被清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31536692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com