イベントを発生させる簡単な例

中級VBA

はじめに

 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 クラス イベントを発生するクラスとして宣言
 呼び出されるイベントプロシージャは、コードウインドウ上部のドロップダウンリストから選択して記述

コメント

タイトルとURLをコピーしました