2

我有一些我自己的对象,我ThisWorkbook在 Excel 中实例化了这些对象。我遇到了一些麻烦,我认为问题在于 VBA 在宏结束后立即杀死我的实例。

我们正在使用ThisWorkbook

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

  • 如果我在事件中实例化一个对象ThisWorkbookWorkbook_Open()则该对象在事件完成触发时被销毁。同样,即使变量在类中变暗ThisWorkbook而不是在子类中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。只有在宏 1 或 Open_Workbook(在它们的 End Sub 之前)调用宏 2 时,它才会找到 myInstance。我需要解决这个问题。(我从单独的表单按钮运行这些宏,而不是在其他宏中。)

4

3 回答 3

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
于 2012-11-13T19:34:57.417 回答
1

在 VBA 编辑器 ( ) 中为项目创建一个新模块Module1,并插入以下代码:

Dim testVar As Integer

Sub Test()
    testVar = testVar + 1
    MsgBox testVar
End Sub

然后添加一行,例如 Worksheet 的 Activate 或 Open 事件:

Module1.Test

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

于 2012-11-13T19:51:05.207 回答
0

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

于 2015-05-08T05:15:39.247 回答