「Excel VBAのクラス」について第11回目です。インスタンス化(New)するときに実行される「コンストラクタ」とインスタンス解放時に実行される「デストラクタ」についてです。
前回、表データのインスタンスをコレクション化しました。そのコレクションからデータを取り出す方法を勉強する前に「コンストラクタ」と「デストラクタ」というものについて学んでおきましょう (^^)
わかりました。「コンストラクタ」って初めて聞きました。
今回もよろしくお願いしますm(_ _)m
はじめに
クラスをインスタンス化(New)したときに実行されるコードを「コンストラクタ」と言います。
そして、インスタンスが破棄(Nothing)されたときに実行されるコードが「デストラクタ」です。
今回はVBAの「コンストラクタ」と「デストラクタ」について勉強していきます。
【この記事でわかることは】
・Excel VBA における「コンストラクタ」と「デストラクタ」について
VBAのコンストラクタ/デストラクタとは
VBAのコンストラクタはイベントプロシージャ Class_Initialize で定義します。ただし、VBAのコンストラクタには引数を設定することはできません。
コンストラクタの使い方
コンストラクタは、クラスのインスタンスを生成(New)するときに実行されるメソッドで、主にそのクラスのメンバ変数(クラス内の変数)を初期化するときに使用します。
コンストラクタを書く場所
VBA にはそれらに対応したイベントがあります。Class_Initialize の場所は次のとおりです。
Classモジュールのコード左上にある (General) プルダウンから [Class] を選択します。
コードの右上プルダウンで [Initialize] または [Terminate] を選択できますが、デフォルトで [Initialize] が自動的に選択されます。
選択されたプロシージャ Private Sub Class_Initialize() が自動で表示されます。
これの部分を見ただけで引数を渡せないことがわかりますね。
コンストラクタの利用法
コンストラクタでは、インスタンス化した際に発生する Class_Initialize イベントで、一般的には変数の初期化などの処理を行ったりさせます。
VBAの場合、Class_Initialize() に引数を渡すことはできない仕様になっています。
デストラクタの場合
デストラクタでは、インスタンスを開放した際に発生する Class_Terminate イベントを処理して、クラスの中で使用しているオブジェクトなどを解放したりできます。
基本的な使用例
コンストラクタとデストラクタの簡単な例が次のコードです。
※ 各コードの解説は、コード内のコメントを参照願います。
'プロパティ変数
Public OwnerName As String
Private Sub Class_Initialize()
'ここに初期設定を書く
OwnerName = "くるみこパパ" '変数に初期値代入
End Sub
Private Sub Class_Terminate()
'ここに後始末の処理を書く
MsgBox "Classのインスタンス開放"
End Sub
標準モジュール側のコードです。明示的にインスタンスを Nothing で解放しています。
'標準モジュールのコード(Set ※ = Nothing あり)
Sub Class_Event_Test()
Dim c As Class1
Set c = New Class1 'Class_Initialize 発生
MsgBox c.OwnerName '変数の値を確認
Set c = Nothing 'Class_Terminate 発生
End Sub
Nothing していないこちらのコードでも「デストラクタ」が発生します。
'標準モジュールのコード(Set ※ = Nothing 無し)
Sub Class_Event_Test2()
Dim c As Class1
Set c = New Class1 'Class_Initialize 発生
MsgBox c.OwnerName '変数の値を確認
End Sub 'ここで Class_Terminate 発生
このコードでは明示的に Nothing で解放していませんが、モジュールを抜ける際に自動的にインスタンスは解放されるので「End Sub」の段階で Class_Terminate イベントが発生します。
「コンストラクタ」と「デストラクタ」の結果メッセージの画像が次のとおりです。
まとめ(おわりに)
以上、Excel VBAの「コンストラクタ」と「デストラクタ」について、それぞれの発生タイミングと簡単ですが利用例などを紹介しました。
クラスの11回目でした。
「コンストラクタ」と「デストラクタ」についてでした。VBAのコンストラクタについては、他言語のように引数を渡すことが出来ないことも覚えておいてください。
引数を渡せないから変数の初期化などの簡単な処理にしか使えないんですね。
引数が渡せるような裏技とかは無いのでしょうか(^^?
そうですね。
「コンストラクタ」に引数を渡すことはできませんが、それに代わる方法についてはいくつかあるようですので検討していきたいと思っています。引数を渡すようにできればもっと便利に使えそうですからね(^^)
わかりました。よろしくお願いしますm(_ _)m
まとめ
最後に、今回勉強した内容を整理しておきましょう。
次回は、引数を渡せないVBAのコンストラクタですが、うまく利用して代替できる案ついて検討しています。よろしければ引き続きこちらをご覧ください。
Excel VBA クラスについての記事一覧
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
過去記事のサンプルファイルをダウンロードできます
この記事のサンプル登録はありません。記事内のコードをご利用ください。
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください