我在Excel的ThisWorkbook
中实例化了一些自己的对象。我遇到了一些问题,我认为问题是VBA在宏结束后立即杀死了我的实例。
我们使用ThisWorkbook
:
-
如果我在宏中为
ThisWorkbook
定义自己的变量,那么在宏完成后,该变量的值将返回到初始化值,即使该变量在ThisWorkbook
类中是Dim'd,而不是在模块中。(即0、Nothing等) -
如果我在
Workbook_Open()
事件中为ThisWorkbook
实例化一个对象,那么当事件触发时,该对象将被销毁。同样,即使变量在ThisWorkbook
的类中是Dim'd,而不是在Workbook_Open()
的子中
我能做些什么来确保这些对象存活下来,并且这些变量保持其值吗?
在ThisWorkbook
:中
'Object we want to survive
Dim myInstance As MyObject
Private Sub Open_Workbook()
Set myInstance = new MyObject ' Object is instantiated
End Sub
' Macro 1
Public Sub MyMacro()
Set myInstance = new MyObject ' Object is instantiated
End Sub
' Macro 2
Public Sub CheckInstance()
If Not myInstance is Nothing Then
MsgBox "I found an instance!"
End If
End Sub
无论是打开工作簿还是运行宏1,都不会导致宏2找到myInstance。在这两种情况下,Macro2都会认为myInstance是Nothing。宏2只有在宏1或Open_Workbook内部(在其End Sub之前)调用时才会找到myInstance。我需要解决这个问题。(我从单独的窗体按钮运行这些宏,而不是在其他宏中。)
是的,您需要在宏之外创建变量。
否则,它们总是会随着宏的结束而被销毁。
'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作为一个类:
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
在VBA编辑器(Module1
)中为项目创建一个新模块,并插入以下代码:
Dim testVar As Integer
Sub Test()
testVar = testVar + 1
MsgBox testVar
End Sub
然后添加一行,例如工作表的激活或打开事件:
Module1.Test
它对我有效,每次我激活工作表时,值都在增加。
为什么不尝试使用数组?你把它从宏中调暗,它会保留数据,直到你用另一个宏清除它或关闭工作簿。