こんにちは、なかぜんです。Access VBAでフォームやボタンの処理がどんどん増えて、「あれ、どこに何書いたっけ?」と迷子になること、ありませんか?
業務が複雑になると、どうしてもコードが「一枚岩」になってしまいがち。でも、そんな時に便利なのが「イベント駆動設計」という考え方です。
今回は、Access VBAでも実践できるイベント駆動設計の手法と、具体的な整理テクニックを解説します。
イベント駆動設計とは?
イベント駆動設計とは、簡単に言えば「ある出来事(イベント)が起きた時だけ、特定の処理を行う」という設計手法です。フォームのボタンクリックや更新イベントなどに処理を分離し、処理を部品化(モジュール化)していくイメージですね。
従来の「手続き型」の課題
- 1つのボタンに大量の処理が書かれ、読みにくい
- 処理を再利用しにくい
- 影響範囲が見えず、修正が怖い
イベント駆動設計のメリット
- 処理が分離されていて読みやすい
- 共通処理はモジュールに切り出せる
- 再利用・テストがしやすくなる
実際のコード例:イベント→処理を振り分ける
以下は「受注ステータスを変更するボタン」を例に、イベント駆動設計でスリム化したコード例です。
' フォームのボタンイベント
Private Sub btnStatusUpdate_Click()
Call HandleEvent("UPDATE_STATUS")
End Sub
' イベントハンドラ
Private Sub HandleEvent(ByVal eventType As String)
Select Case eventType
Case "UPDATE_STATUS"
Call mod_OrderLogic.UpdateOrderStatus(Me.txtOrderID.Value)
Case "CANCEL_ORDER"
Call mod_OrderLogic.CancelOrder(Me.txtOrderID.Value)
End Select
End Sub
解説:
btnStatusUpdate_Click
はただのトリガーです。- 実際の処理は
mod_OrderLogic
モジュールに委任しています。 - イベントの種類を文字列で分岐することで、拡張性も高くなります。
注意点・よくあるミス
1. イベント名のタイポ
イベント名を文字列で指定する場合、タイプミスに注意が必要です。定数化やEnumでの管理がおすすめです。
Enum AppEvent
UPDATE_STATUS = 1
CANCEL_ORDER = 2
End Enum
2. モジュールの分けすぎで逆に見づらくなる
処理を分離しすぎると、今度は「どこで何をしているのかわからない」問題も起きます。基本は「画面単位 or 業務単位」でまとめましょう。
3. イベントが多すぎて分岐が肥大化
イベント名が多くなりすぎたら、ディスパッチ(分配)処理を別クラスまたは辞書オブジェクトで整理するのも手です。
応用ポイント:動的なイベント登録
実はAccess VBAでも、コントロールに動的にイベント処理をバインドすることが可能です(WithEvents+クラスを活用)。
' Classモジュール: clsButtonWrapper
Public WithEvents btn As Access.CommandButton
Private Sub btn_Click()
MsgBox "ボタンがクリックされました!"
End Sub
このように、クラスを使ってイベントを抽象化することで、より柔軟なUI処理設計も可能です。
まとめ:イベント駆動設計で見通しのよいVBAへ
今回は、Access VBAでも実践できる「イベント駆動設計」の基礎と応用についてご紹介しました。
- イベントごとに処理を分離して整理
- 再利用性や保守性の向上
- 将来的な拡張にも強い
最初はちょっとだけ手間が増えたように感じるかもしれませんが、メンテナンス性や業務の複雑化に対応するには、非常に効果的な設計アプローチです。
