我有一些自己的对象,可以在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

09-28 05:06