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



我在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

它对我有效,每次我激活工作表时,值都在增加。

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

最新更新