VBAでもイベントを自作できる? ― Class・WithEvents・RaiseEventを最小コードで試す

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成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 = 1Changed = 2 と2回イベントが届くかを観察します。イベントの回数と状態変化を対応付けるのがポイントです。

仕事で使うなら

イベントは便利ですが、流れが見えにくくなることもあります。

  • 誰がpublisherで誰がsubscriberか名前を明確にする

  • オブジェクトをローカル変数だけにして早く破棄しない

  • イベント内で再び状態を変えて再入しないか考える

  • エラーを握りつぶさない

  • イベントの順序へ過度に依存しない

最初はDebug.Printで発火順を見える化すると理解しやすくなります。

公式情報・一次情報

まとめ

VBAでも EventRaiseEventWithEvents を使えば独自イベントを作れます。最小Counterで「状態変更 → event → handler」の順を見てから、GUIや非同期処理へ進むとイベント駆動を追いやすくなります。

文書情報

記事タイトル
VBAでもイベントを自作できる? ― Class・WithEvents・RaiseEventを最小コードで試す
作成日
更新日
Source URL
https://papanda925.com/?p=15359

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

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