我有一些自己的对象,我在Excel中ThisWorkbook
内实例化。我有some trouble,我认为问题是,一旦宏结束,VBA就会杀死我的实例。
我们正在使用ThisWorkbook
:
如果我在宏中为ThisWorkbook
定义我自己的变量,那么该变量的值会在宏完成后返回初始化值,即使该变量在{{{I}类中为Dim'd 1}}而不是在模块中。 (即0,Nothing等)
如果我在ThisWorkbook
事件中为ThisWorkbook
实例化对象,则在事件完成触发时会销毁该对象。同样,即使变量在Workbook_Open()
类中为Dim'd而在ThisWorkbook
我能做些什么来确保这些对象存活并且这些变量保留其值?
在Workbook_Open()
:
ThisWorkbook
打开工作簿和运行宏1都不会导致宏2找到myInstance。在这两种情况下,Macro2都会认为myInstance是Nothing。如果在宏1或Open_Workbook(在它们的End Sub之前)调用它,宏2将只能找到myInstance。我需要修复此问题。 (我从单独的表单按钮运行这些宏,而不是在其他宏中运行。)
答案 0 :(得分:2)
是的,您需要在宏之外创建变量。
否则它们将始终在宏的末尾被销毁。
'will be available as long the file is open
Private lngTest as long
Private Sub Worksheet_Change()
'will be available as long as routine is running
Dim lngTest2 as long
lngTest = lngTest + 1
lngTest2 = lngTest2 + 1
debug.print lngTest
debug.print lngTest2
End Sub
因为您在讨论Workbook_Open
- 要保存变量,即使关闭并重新打开工作簿,也需要另一个构造。我的建议是将它们存储在工作表中,但我相信还有其他方法。
编辑:
使用此测试您发布的代码 - 工作正常,找到实例。
MyObject as a class:
Private lngTest As Long
Public Property Get test() As Long
test = lngTest
End Property
Public Property Let test(ByVal lngValue As Long)
lngTest = lngValue
End Property
答案 1 :(得分:1)
在VBA编辑器(Module1
)中为项目创建一个新模块,并插入以下代码:
Dim testVar As Integer
Sub Test()
testVar = testVar + 1
MsgBox testVar
End Sub
然后添加一行,例如Worksheet的Activate或Open事件:
Module1.Test
对我来说,每次激活工作表时,值都会递增。
答案 2 :(得分:0)
为什么不尝试使用数组?你将它从你的宏中调暗,它将保留数据,直到你用另一个宏清除它或关闭工作簿。