我有一些自己的对象,可以在Excel中的ThisWorkbook
中实例化。我有some trouble,我认为问题是宏结束后VBA会杀死我的实例。
我们正在使用ThisWorkbook
:
如果我在宏中为ThisWorkbook
定义了自己的变量,则即使宏在ThisWorkbook
类中而不在模块中,该变量的值也会在宏完成后返回到初始化值。 (即0,无等)
如果我在ThisWorkbook
事件中为Workbook_Open()
实例化一个对象,则在事件触发后该对象将被销毁。同样,即使变量在ThisWorkbook
类中而不是在Workbook_Open()
的子类中为Dim'd
我可以做些什么来确保这些对象能够生存并且这些变量保留其值?
在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。如果在宏1或Open_Workbook(在它们的End Sub之前)内部调用了myInstance,则宏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作为一个类:
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