【簡単解説】VBA クラスモジュール 2クラスイベント 2021.06.29
今回は、クラスモジュールに用意されているイベントについてです。
内容
●クラスモジュールのイベント
・イベントの種類
・ポイントと使用例
サンプルファイル
記事に載せてあるコードサンプルのファイル ダウンロード
Excelマクロ管理ツール
クラスモジュールのイベント
イベントの種類
クラスモジュールにはイベントが用意されている。イベント種類は次の2つである。
Class_Initialize()はクラス作成時に呼び出され、
Class_Terminate()はクラス破棄時に呼びだされる。
お気づきの方も多いと思うが、ユーザーフォームと同様である。
イベントのポイントと使用例
前述のイベントはクラス作成時と破棄時に呼び出されるが、実際の発生タイミングを確認する。 クラスモジュールと標準モジュールにメッセージ表示するコードを記述し、メッセージボックスが表示される順番で、イベント発生タイミングを確認する。
Private Sub Class_Initialize() MsgBox "イベント:Class_Initialize" End Sub
Private Sub Class_Terminate() MsgBox "イベント:Class_Terminate" End Sub
Sub Sample1() Dim clsSample1 As Class1 MsgBox "変数の型宣言" Set clsSample1 = New Class1 MsgBox "インスタンスを生成" End Sub
Sample1を実行した結果は次の通りである。
インスタンスを生成するタイミングでClass_Initializeイベントが発生している。
また標準モジュールのクラスインスタンスはプロシージャレベルだったため、プロシージャ終了時にインスタンスが破棄され、それに伴いClass_Terminateイベントが発生している。
次はクラスを、モジュールレベルで宣言したサンプルである。
Private Sub Class_Initialize() MsgBox "イベント:Class_Initialize" End Sub
Private Sub Class_Terminate() MsgBox "イベント:Class_Terminate" End Sub
'宣言セクション Dim clsSample1 As Class1
Sub Sample2() Set clsSample1 = New Class1 MsgBox "インスタンスを生成" End Sub
Sub Sample3() Set clsSample1 = Nothing MsgBox "クラスを破棄" End Sub
Sample2を実行した結果は次の通りである。モジュールレベルの変数のため、プロシージャが終了してもClass_Terminateイベントは発生しない。
Sample2実行後に、Sample3を実行すると「イベント:Class_Terminate」→「クラスを破棄」の順番でメッセージが表示される。
またSample2実行後に再度Sample2を実行すると(変数が保持された状態で再度インスタンスを生成)
「イベント:Class_Initialize」→「イベント:Class_Terminate」→「インスタンスを生成」の順番でメッセージが表示される。
次は、モジュールレベルでNewキーワードを用いる宣言のサンプルである。
Private Sub Class_Initialize() MsgBox "イベント:Class_Initialize" End Sub
Private Sub Class_Terminate() MsgBox "イベント:Class_Terminate" End Sub
Sub Msg() MsgBox "クラスモジュール:サブルーチン" End Sub
'宣言セクション Dim clsSample1 As New Class1
Sub Sample4() clsSample1.Msg End Sub
Sub Sample5() Set clsSample1 = Nothing MsgBox "クラスを破棄" End Sub
Sample4を実行した結果は次の通りである。
初めてクラスのサブルーチンを使用するタイミングでClass_Initializeイベントが発生していることがわかる。
Sample4を実行後に再度Sample4を実行すると「クラスモジュール:サブルーチン」のメッセージのみ表示される。