お互いを参照する必要があるVBAでカスタムオブジェクトをいくつか作成する必要があり、いくつかの問題があります。
最初に-オブジェクトコンストラクターはVBAでどのように機能しますか?コンストラクタはありますか?
次に、デストラクタはありますか? VBAはオブジェクトのライフサイクルの終了をどのように処理しますか?他のオブジェクトを参照するオブジェクトがある場合(これが唯一の参照です)、それをNothingに設定してそれを実行できますか、それでメモリリークが発生する可能性がありますか?
この準OOの要素は少しイライラします。
VBAはクラスモジュールをサポートしています。これらには、コンストラクターであるClass_Initializeイベントと、デストラクターであるClass_Terminateがあります。プロパティとメソッドを定義できます。 VBAではオブジェクトのライフサイクルに参照カウントを使用していると思います。これが、そのタイプのコードに多くの「何でもセット=何もない」が表示される理由です。あなたの例の場合、メモリをリークしないと思います。ただし、循環参照には注意する必要があります。
VBAでクラスモジュールを作成している場合、コンストラクターには次を使用できます。
Private Sub class_initialize()
....
End Sub
VBAはガベージコレクションされるため、デストラクタはありません。循環参照をクリーンアップしてください。メモリリークの可能性を回避する必要があります。
私はそれらを使用してから久しぶりですが、コンストラクターにパラメーターを渡すことはできないと思います。それは私が遭遇した問題の1つだと思いますが、私はこれらのクラスがどのように機能するか、どのように機能することを期待していたかについて、多くの問題に遭遇しました。
Class_Terminateがあり、これはデストラクタとほとんど同じです。
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が閉じているときのみ)