簡體   English   中英

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

[英]VBA preserve instances after macro completes (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。 如果在宏 1 或 Open_Workbook 中(在它們的 End Sub 之前)調用它,宏 2 只會找到 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

它對我有用,每次激活工作表時該值都會增加。

為什么不嘗試使用數組? 你把它從你的宏中調暗,它會保留數據,直到你用另一個宏清除它或關閉工作簿。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM