はじめに
Excel VBAでは、あるクラスから別のクラスに対してイベントを発生させることができます。
「クラスに対して」なので標準モジュールのプロシージャでイベントを発生させる事はできません。イベントの発生はクラスモジュール同士やシートモジュール、ユーザーフォームなどで利用できます。
少なくともクラスの知識が必要となります。少々手順が厄介なので、簡単な例で使い方を試してみてから使う方が良いでしょう。ここでは、親クラス(CParent) と子クラス(CChild) を作って、子クラスで発生させたイベントを親クラスで受信してみます。
※親クラス、子クラスという場合には継承されたクラスを指す場合が多いようですが、ここでは、親クラスの中に子クラスを変数として持っている状態と捉えてください。
子クラスの作成
まずは、イベントを発生させるクラスから書き始めた方が良いでしょう。
クラスモジュールにCChildという名前でクラスを作り、以下のコードを書きます。
'//子クラス CChildクラス (CParentから呼ばれる)
Private num As Long
Public Event OverCount(v As Long) '/// イベントの宣言
Private Sub Class_Initialize()
num = 0
End Sub
Property Let Value(x As Long)
num = x
If num > 10 Then
RaiseEvent OverCount(num) 'イベントを発生させる
End If
End Property
発生させるイベントプロシージャを宣言します。(宣言だけです)
Public Event イベントプロシージャ名 ( 引数 )
イベントを発生させるコードを書きます。
RaiseEvent イベントプロシージャ名 ( 引数 )
親クラスの作成
次にイベントを受信するクラスを書きます。
'//親クラス CParent
Private flag As Boolean
Private WithEvents child As CChild '/// イベントが発生するクラス
'/// コードウインドウ上部のドロップダウンリストから
'/// childクラスのOverCOuntプロシージャが選択できるようになる
Private Sub child_OverCount(v As Long) '呼び出されるイベント
flag = True
MsgBox "10を超えた"
End Sub
Private Sub Class_Initialize()
flag = False
Set child = New CChild
End Sub
Public Sub Count()
Dim i As Long
For i = 0 To 15
child.Value = i
If flag Then
MsgBox "終了します。"
Exit For
End If
Next i
End Sub
親クラスである CParent の宣言部分で、子クラスの CChild を宣言していますが、イベントを受信する場合は、WithEvents を付けて宣言します。
Private WithEvents クラス変数名 As クラス名
呼び出されるイベントの記述は、VBEのコードウインドウ上部のドロップダウンリストから選択する事になります。


通常のイベントプロシージャと同じように自動でプロシージャが記述されます。(コードの赤い下線部分)
プログラムをテスト
これで親クラスのCount関数を実行すれば、子クラスがイベントを発生させます。標準モジュールにテストプログラムを書きます。
'// 標準モジュールに記述します
Sub macro()
Dim parent As CParent
Set parent = New CParent
parent.Count
End Sub
結果は、CParent の Count関数内で、子クラス CChild が10より大きい値となったときイベントが発生し、親クラスが受信してメッセージを出してFor文を抜けます。
今回のように子クラスから親クラスを呼び出したいようなケースで使えます。(ただ、今回のケースではわざわざイベントを用いなくても実現できます)
まとめ
イベント発生は少々面倒なので、要点をまとめておきます。
・イベント送信クラス
Public Event イベントプロシージャ名() でイベント宣言
RaiseEvent イベントプロシージャ名() としてイベント発生させるコード部分に記述
・イベント受信クラス
Private WithEvents クラス変数 As クラス イベントを発生するクラスとして宣言
呼び出されるイベントプロシージャは、コードウインドウ上部のドロップダウンリストから選択して記述
コメント