2

ThisWorkbookExcel内でインスタンス化する独自のオブジェクトがいくつかあります。問題は、マクロが終了するとすぐに VBA がインスタンスを強制終了していることだと思います。

使用していますThisWorkbook

  • マクロで独自の変数を定義するとThisWorkbook、変数がモジュールではなくクラスで Dim されている場合でも、マクロが完了すると、その変数の値は初期化値に戻りThisWorkbookます。(つまり、0、なしなど)

  • イベントでオブジェクトをインスタンス化するとThisWorkbookWorkbook_Open()イベントの発生が完了するとオブジェクトが破棄されます。繰り返しますが、変数が forThisWorkbookのサブクラスではなくクラスで Dim されている場合でも、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 を検索します。これを修正する必要があります。(これらのマクロは、他のマクロ内ではなく、別のフォーム ボタンから実行しています。)

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

次に、たとえばワークシートの Activate または Open イベントに行を追加します。

Module1.Test

それは私にとってはうまくいきました。シートをアクティブにするたびに値が増加していました。

于 2012-11-13T19:51:05.207 に答える