web-dev-qa-db-ja.com

Excel VBAオブジェクトのコンストラクタとデストラクタ

お互いを参照する必要があるVBAでカスタムオブジェクトをいくつか作成する必要があり、いくつかの問題があります。

最初に-オブジェクトコンストラクターはVBAでどのように機能しますか?コンストラクタはありますか?

次に、デストラクタはありますか? VBAはオブジェクトのライフサイクルの終了をどのように処理しますか?他のオブジェクトを参照するオブジェクトがある場合(これが唯一の参照です)、それをNothingに設定してそれを実行できますか、それでメモリリークが発生する可能性がありますか?

この準OOの要素は少しイライラします。

25
notnot

VBAはクラスモジュールをサポートしています。これらには、コンストラクターであるClass_Initializeイベントと、デストラクターであるClass_Terminateがあります。プロパティとメソッドを定義できます。 VBAではオブジェクトのライフサイクルに参照カウントを使用していると思います。これが、そのタイプのコードに多くの「何でもセット=何もない」が表示される理由です。あなたの例の場合、メモリをリークしないと思います。ただし、循環参照には注意する必要があります。

24
Will Rickards

VBAでクラスモジュールを作成している場合、コンストラクターには次を使用できます。

Private Sub class_initialize()
....
End Sub

VBAはガベージコレクションされるため、デストラクタはありません。循環参照をクリーンアップしてください。メモリリークの可能性を回避する必要があります。

17
Colin

私はそれらを使用してから久しぶりですが、コンストラクターにパラメーターを渡すことはできないと思います。それは私が遭遇した問題の1つだと思いますが、私はこれらのクラスがどのように機能するか、どのように機能することを期待していたかについて、多くの問題に遭遇しました。

9
greg

Class_Terminateがあり、これはデストラクタとほとんど同じです。

7
TechnoS

Class_initializeとclass_terminateを確認します。

このTestClassを記述することで確認できます。

Public testVar As Integer

Private Sub class_initialize()
    Debug.Print "Class init"
    testVar = 10
End Sub

Private Sub class_terminate()
    Debug.Print "Class terminate"
End Sub

そして、このコードをモジュールに書きます:

Sub test()
   Dim myTestClass As New TestClass
   Debug.Print myTestClass.testVar
End Sub

そして、デバッグウィンドウにログが表示されます。しかし、このテストでは、インスタンスを(newで)作成するときにclass_initializeが呼び出されず、インスタンス内のメソッドの最初の呼び出し時またはvar値の取得時にのみ呼び出されることがわかります。

Class_terminateは、testModuleの最後に呼び出されるようです(Thisworkbookオブジェクトでインスタンスが作成された場合、terminateは「決して」呼び出されません...おそらく、ブックが閉じているとき、またはExcelが閉じているときのみ)

1
Elloco