B-Teck!

お仕事からゲームまで幅広く

【VBA】コンストラクタとデストラクタ

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

とかした場合でも走るらしいんだけど、ちゃんと走らずに遅れて動く場合もあるとかないとか。

引数設定できなかったり、動くタイミングが謎だったり、いまいち使い勝手悪いよなあ