VBAにもクラスのコンストラクタとデストラクタがあるらしく、利用方法をまとめた。
Public Sub Class_Initialize() 'ここに処理を書く End Sub
デストラクタ
Public Sub Class_Terminate() 'ここに処理を書く End Sub
ただし、引数を設定することが出来ず、宣言と同時に初期化を行った場合にはClass_Initializeが走らないという謎の挙動をしてる
TestClass
Public Sub Class_Initialize() debug.print "コンストラクタが動いたよ!" End Sub Public Sub Class_Terminate() debug.print "デストラクタが動いたよ!" End Sub
Test1プロシージャ
Public Sub Test1() Dim testA As TestClass Set testA = New TestClass 'Class_Initializeが実行される End Sub
Test2プロシージャ
Public Sub Test2() Dim testB As New TestClass 'Class_Initializeが実行されない End Sub
Set句を用いての初期化の場合、実際にTestClassのインスタンスが使用されるけど、
Dim句と同時に初期化を行うと、そうではないらしい。
↓2015/03/03訂正
Class_Terminateは、オブジェクトが解放された時に勝手に走るので、Test1・Test2のどちらでも、
End Subのところで走る。
Test2ではオブジェクト変数の宣言時に設定しているのみで、Class_Initializeが走らない
→ということはオブジェクトに対する参照が発生していない。
そのため、オブジェクトへの参照が破棄された場合に実行されるClass_Terminateは実行されない。
Test1の実行時のClass_Terminateは、NothingのSet時に発生する。(EndSubじゃなかった)
↓2015/09/22追記
コメント欄で指摘いただいたように、VB6系の言語では"宣言時にNew句を用いてもインスタンスが生成されない"らしい。
Set句やオブジェクト自体に大して、実際にアクセスが発生した際に始めてインスタンスが生成されるみたい。
zebratchさんの下記記事がよりわかりやすく解説されています。zebratch.blog.so-net.ne.jp
Public Sub Test1() Dim testA As TestClass Set testA = New TestClass 'Class_Initializeが実行される Set testA = Nothing 'Class_Terminateが実行される? End Sub
とかした場合でも走るらしいんだけど、ちゃんと走らずに遅れて動く場合もあるとかないとか。
引数設定できなかったり、動くタイミングが謎だったり、いまいち使い勝手悪いよなあ