この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。VBAのEvent / RaiseEvent / WithEventsの公式言語リファレンスを基準に、独自イベントが「発生する → 受け取る」流れを最小コードで観察できる形に整理しています。
検証ステータス:📘 公式情報確認済み・Excel実機未確認
VBAはWorksheetのClickやChangeイベントを受けるだけではありません。Class Moduleで自分の Event を宣言し、RaiseEvent で発火し、WithEvents で受け取る小さなイベント駆動を作れます。
今回の成功条件
Counterの値を1増やしたとき、イミディエイトウィンドウへ次のような順番が出れば成功です。
[START] AddOne [EVENT] Changed = 1 [SUCCESS] event received
VBAのイベント構文はMicrosoft Learnの言語リファレンスで確認できます。
まず動かす:Class Module
Class Moduleを追加し、名前を Counter にします。
Option Explicit
Public Event Changed(ByVal NewValue As Long)
Private mValue As Long
Public Sub AddOne()
mValue = mValue + 1
RaiseEvent Changed(mValue)
End Sub
Event Changed がイベントの宣言、RaiseEvent Changed(...) がイベントを発生させる箇所です。
受け取る側のClass Module
もう1つClass Moduleを追加し、名前を CounterObserver にします。
Option Explicit
Public WithEvents Target As Counter
Private Sub Target_Changed(ByVal NewValue As Long)
Debug.Print "[EVENT] Changed = " & NewValue
End Sub
WithEvents を付けた変数は、そのオブジェクトが公開するイベントを受け取れます。ハンドラ名は Target_Changed のように「変数名_イベント名」になります。
標準Moduleから配線する
Option Explicit
Private mCounter As Counter
Private mObserver As CounterObserver
Public Sub RunEventDemo()
Debug.Print "[START] AddOne"
Set mCounter = New Counter
Set mObserver = New CounterObserver
Set mObserver.Target = mCounter
mCounter.AddOne
Debug.Print "[SUCCESS] event received"
End Sub
sequenceDiagram
participant M as Standard Module
participant C as Counter
participant O as CounterObserver
M->>C: AddOne
C->>C: mValue = mValue + 1
C-->>O: RaiseEvent Changed(1)
O-->>M: Debug.Print [EVENT]
ここを見る
普通の関数呼び出しでは、呼び出し元が「次に誰を呼ぶか」を直接指定します。イベントではCounter側は「Changedが起きた」と通知し、購読している側が反応します。
この形を小さく理解しておくと、GUI、COMイベント、非同期HTTPなどのイベント駆動を読むときに役立ちます。
1か所変えてみる
AddOne を2回呼びます。
mCounter.AddOne mCounter.AddOne
Changed = 1、Changed = 2 と2回イベントが届くかを観察します。イベントの回数と状態変化を対応付けるのがポイントです。
仕事で使うなら
イベントは便利ですが、流れが見えにくくなることもあります。
誰がpublisherで誰がsubscriberか名前を明確にする
オブジェクトをローカル変数だけにして早く破棄しない
イベント内で再び状態を変えて再入しないか考える
エラーを握りつぶさない
イベントの順序へ過度に依存しない
最初はDebug.Printで発火順を見える化すると理解しやすくなります。
公式情報・一次情報
まとめ
VBAでも Event、RaiseEvent、WithEvents を使えば独自イベントを作れます。最小Counterで「状態変更 → event → handler」の順を見てから、GUIや非同期処理へ進むとイベント駆動を追いやすくなります。
