本ページには広告が含まれています。

Excel VBA クラス コンストラクタとデストラクタ(Lv.11)

Excel VBA クラスのコンストラクタとデストラクタ
画像はCanva「Text to Image」で生成しました

「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() が自動で表示されます。

これの部分を見ただけで引数を渡せないことがわかりますね。

Initialize:コンストラクタはここです。クラスを New したときに発生します。
Terminate:デストラクタがここです。クラスに Nothing を設定したときに発生します。

コンストラクタの利用法

コンストラクタでは、インスタンス化した際に発生する 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

まとめ

最後に、今回勉強した内容を整理しておきましょう。

Excel VBA における「コンストラクタ」と「デストラクタ」について

【コンストラクタ】とは、クラスからインスタンスを生成(New)したときに、強制的に実行される特別なイベントプロシージャ Class_Initialize() のことです。

※ VBAではこの Class_Initialize()に引数を渡すことが出来ません。

【デストラクタ】とは、インスタンスが破棄(Nothing)されたときに実行されるイベントプロシージャ Class_Terminate() のことです。
※ 明示的に Nothing しなくてもプロシージャ終了時にインスタンスは解放されます。

次回は、引数を渡せないVBAのコンストラクタですが、うまく利用して代替できる案ついて検討しています。よろしければ引き続きこちらをご覧ください。

Excel VBA クラスについての記事一覧

Excel VBA クラスの作成・使い方について(Lv.1)
Excel VBA クラスのプロパティ設定について(Lv.2)
Excel VBA クラスにメソッドを設定する方法(Lv.3)
Excel VBA クラスをインスタンス化する方法(Lv.4)
Excel VBA クラス Propertyプロシージャ(Lv.5)
Excel VBA クラス Property Getプロシージャ(Lv.6)
Excel VBA クラス Property Letプロシージャ(Lv.7)
Excel VBA クラス Property Setプロシージャ(Lv.8)
Excel VBA シートの表データからクラスを作成 (Lv.9)
Excel VBA クラス インスタンスをコレクション化(Lv.10)
Excel VBA クラス コンストラクタとデストラクタ(Lv.11)
Excel VBA クラス コンストラクタを利用する方法(Lv.12)
Excel VBA クラス コレクションの要素取得方法(Lv.13)
Excel VBA クラス コレクション要素の追加と削除(Lv.14)
Excel VBA クラス コレクションの内容を書き出す(Lv.15)
Excel VBA クラス UserFormで機能を操作する(Lv.16)
Excel VBA クラス コレクションの最大要素数について(Lv.17)

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク
スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

この記事のサンプル登録はありません。記事内のコードをご利用ください。

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください