宏完成后VBA保留实例(Excel)

时间:2012-11-13 19:21:17

标签: excel vba excel-vba scope instance

我有一些自己的对象,我在Excel中ThisWorkbook内实例化。我有some trouble,我认为问题是,一旦宏结束,VBA就会杀死我的实例。

我们正在使用ThisWorkbook

  • 如果我在宏中为ThisWorkbook定义我自己的变量,那么该变量的值会在宏完成后返回初始化值,即使该变量在{{{I}类中为Dim'd 1}}而不是在模块中。 (即0,Nothing等)

  • 如果我在ThisWorkbook事件中为ThisWorkbook实例化对象,则在事件完成触发时会销毁该对象。同样,即使变量在Workbook_Open()类中为Dim'd而在ThisWorkbook

  • 的子类中也是Dim'd

我能做些什么来确保这些对象存活并且这些变量保留其值?

Workbook_Open()

ThisWorkbook

打开工作簿和运行宏1都不会导致宏2找到myInstance。在这两种情况下,Macro2都会认为myInstance是Nothing。如果在宏1或Open_Workbook(在它们的End Sub之前)调用它,宏2将只能找到myInstance。我需要修复此问题。 (我从单独的表单按钮运行这些宏,而不是在其他宏中运行。)

3 个答案:

答案 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)

为什么不尝试使用数组?你将它从你的宏中调暗,它将保留数据,直到你用另一个宏清除它或关闭工作簿。