【VBA】イベントプロシージャを理解する(概要と具体例)

VBA

フォームやレポート、そこに配置されるコントロールには、すべて「イベント」と呼ばれるプロパティを持っています。イベントは、実際にVBAを動かすきっかけとなるアクションを設定するプロパティであり、そのイベントに紐づけたVBAを「イベントプロシージャ」といいます。

この記事では、様々な種類があるイベント及びイベントプロシージャについて、概要から実際の記述例まで、わかりやすく解説します。

イベントプロシージャとは

Accessの「イベント」とは、ユーザーの操作やフォームの状態変化によって発生するアクションのことです。

たとえば、

  • フォームを開く
  • ボタンをクリックする
  • テキストボックスの値が変更される

こうした「イベント」が、各コントロールのプロパティとして多くの種類が用意されています。

各コントロールのイベントプロパティ

こうした動作をトリガーにして、自動的に何らかの処理を実行するのが「イベントプロシージャ」です。
イベントプロシージャの実態はVBA(Visual Basic for Applications)で書かれたプログラムです。

イベントに割り当てられたイベントプロシージャは、各イベントがユーザの手で行われたタイミングで動作する仕組みとなっています。

まとめると、イベントとイベントプロシージャの関係は、以下のようになっています。

よく使うイベントの種類

ここでは数多くのイベントの中から、よく使われるものをピックアップして解説します。

フォーム全体に関連するイベント

フォームを開いたり閉じたりするタイミングで、何らかの処理を作動させる際によく使用される「イベント」は下表のとおりです。

イベント名発生タイミング
Openイベント(開く時)フォームが開かれたとき(最初のレコードが表示される前)
Loadイベント(読み込み時)フォームの開きレコードが表示されるとき
Activateイベント(アクティブ時)フォームがアクティブ(最前面)になったとき
Unloadイベント(読み込み解除時)フォームを閉じる直前
Deactivateイベント(非アクティブ時)フォームが非アクティブ(フォーカスが外れた)になったとき
Closeイベント(閉じる時)フォームを閉じたとき(画面に表示されなくなるとき)

【補足】
それぞれの発生タイミングは記載したとおりですが、複数のイベントにプロシージャを設定している場合は、イベントの優先順位によって、順次実行されていきます

フォームを開く系の場合は次の順番で実行されます。

OpenイベントLoad イベントActivateイベント

加えて、上記3つのイベントでは、Openイベントのみキャンセル(処理を途中で止める)することができるという違いがあります。

フォームを閉じる系の場合は次の順番で実行されます。

UnloadイベントDeactivate イベントCloseイベント

加えてこちらも、Unloadイベントのみキャンセル(処理を途中で止める)できます。

コントロールに関連するイベント

入力系

テキストボックスやコンボボックスへの入力や更新を行うタイミングで、何らかの処理を作動させる際によく使用される「イベント」は下表のとおりです。

イベント名発生タイミング
BeforeUpdateイベント(更新前処理)値が確定する直前に発生(入力値を検証してキャンセル可能)
AfterUpdateイベント(更新後処理)値が変更・確定した直後(入力後の処理を実行)
Changeイベント(変更時)入力中に毎回発生(文字を1文字ずつ変更するたびに動作)
GetFocusイベント(フォーカス取得時)コントロールにフォーカス(カーソル)が当たったとき
LostFocusイベント(フォーカス喪失時)フォームが非アクティブ(フォーカスが外れた)にフォーカスが外れたとき(別のコントロールへ移ったなど)

【補足】
 テキストボックス等の値を変更し、フォーカスが移動した段階で BeforeUpdateイベントAfterUpdateイベント の順序でイベントが発生します。よく使われるケースとしては、BeforeUpdateイベント にテキストボックスの値を判定するプロシージャを設定し、NG判定であれば処理をキャンセルし、OKであれば AfterUpdateイベント に移行するというものです。

操作系

コマンドボタンやチェックボックス、オプションボタンといったコントロールを操作したタイミングで、何らかの処理を作動させる際によく使用される「イベント」は下表のとおりです。

イベント名発生タイミング
Clickイベント(クリック時)コントロールがクリックされたとき
DblClickイベント(ダブルクリック時)コントロールがダブルクリックされたとき
MouseDownイベント(マウスボタンクリック時)マウスのボタンが押された瞬間
MouseUpイベント(マウスボタン解放時)マウスボタンを離したとき
MouseMoveイベント(マウスボタン移動時)マウスポインタがコントロール上を通過している間

【補足】
 ClickイベントMouseDownイベント は、どちらもマウスをクリックした場合に作動するイベントですが、この両者の違いは、マウスをクリックしたときのタイミングにあります。

違いをまとめてみましょう。

項目ClickイベントMouseDownイベント
発生タイミングマウスのボタンを押して離したときマウスのボタンを押した瞬間
使用用途主に「通常のクリック処理(ボタン等)」に使用より細かな制御(右クリック検出・座標取得など)
対応ボタン主に左クリック(標準のClick)左・右・中ボタンの区別が可能
キャンセル不可可能

コマンドボタンをクリックするためのイベントであるClickイベントに対して、MouseDownイベント の使用場面は限定的でしょう。

削除系

(厳密にはコントロールではありませんが)DELキーにより、レコードを削除するタイミングで、何らかの処理を作動させる際に使用される「イベント」は下表のとおりです。

イベント名発生タイミング
Deleteイベント(レコード削除時)削除操作を行った直後、確認ダイアログが表示される前
BeforeDelConfirmイベント(削除前確認)削除ダイアログで「はい/いいえ」が選ばれる直前
AfterDelConfirmイベント(削除後確認)削除操作が完了したあと(またはキャンセル後)

【補足】
 レコードセレクターで対象を選択後、DELキーでレコードが削除されると、DeleteイベントBeforeDelConfirmイベントAfterDelConfirmイベント の順でイベントが発生します。

印刷に関連するイベント

レポートの印刷を行うタイミングで、何らかの処理を作動させる際によく使用される「イベント」は下表のとおりです。

イベント名発生タイミング
Formatイベント(フォーマット時)表示や印刷のためのレイアウトを構築するとき
Printイベント(印刷時)実際に印刷/表示が行われる直前
Nodataイベント(空データ時)レポートに表示すべきデータが1件もなかったとき

【補足】
Nodataイベントに関しては、レポートのレコードソースであるテーブルに、1件もデータがない場合に実行されるイベントという意味で分かりやすいですが、FormatイベントPrintイベント はどちらも印刷前に実行されるイベントですので、違いが分かりにくいかもしれません。

この2つは、目的も実行タイミングも異なるため、使い分けが必要となります。

Formatイベントは、表示レイアウトを整える段階で実行されますので、印刷データを判定して特定のコントロールを非表示するといったことが可能です。
Printイベントは、レイアウト確定後のページごとの小計を行ったりする場合に使用します。

【実践】よく使うイベントプロシージャ例

前項では、比較的よく使われるイベントについて、どういったタイミングで実行されるかについて説明してきました。ここからは、いくつかのイベントをピックアップして具体的なイベントプロシージャ例を解説していきます。

Openイベント

Private Sub Form_Open(Cancel As Integer)
DoCmd.Maximize
End Sub

フォームを開く際に Docmd.Maximizeステートメント により、サイズを最大化する例です。

Loadイベント

Private Sub Form_Load()
    Me.txtDate = Date
End Sub

フォームを読み込む際 テキストボックスtxtDate内に Date関数 で当日日付を反映させる例です。

BeforeUpdateイベント

Private Sub txtZip_BeforeUpdate(Cancel As Integer)
    If Len(Me.txtZip) <> 7 Then
        MsgBox "郵便番号は7桁で入力してください。"
        Cancel = True ' 更新をキャンセル
    End If
End Sub

Len関数 によりテキストボックスtxtZip内の値文字数を数え、7文字以外であれば、注意メッセージを表示したうえで更新処理を中止する例です。

Changeイベント

Private Sub txtSearch_Change()
    Dim strFilter As String
    strFilter = "氏名 Like '*" & Me.txtSearch.Text & "*'"
    Me.lstResults.RowSource = "SELECT 氏名 FROM 顧客マスタ WHERE " & strFilter
End Sub

テキストボックスtxtSearchに1文字入力するごとに、リストボックスlstResultsの一覧を絞りこみしていく例です。Changeイベントは、1文字ずつ毎回発生するイベントであるため、このような仕組みも作ることができます。

Deleteイベント

Private Sub Form_Delete(Cancel As Integer)
    If Me.txtStatus = "確定済" Then
        MsgBox "このレコードは削除できません。"
        Cancel = True
    End If
End Sub

テキストボックスtxtStatusの値が 確定済 であった場合は、注意メッセージを表示したうえで、削除を中止する例です。Deleteイベントを使用することで、一律の削除ではなく、値による削除可否の判定を行うことができます。

NoDataイベント

Private Sub Report_NoData(Cancel As Integer)
    MsgBox "該当するデータがありませんでした。"
    Cancel = True ' レポートの印刷を中止
End Sub

印刷するレポートのレコードソースであるテーブルのデータが存在しない場合。注意メッセージを表示したうえで。印刷を中止する例です。

まとめ

VBAを様々なタイミングで実行するためには、どのようなイベントがあるのかをまずは把握しておくことが大切です。

今回は比較的使用されることが多いイベントを中心にご紹介しましたが、気になったものがあれば、プロパティシートのイベントタブに並んでいる各イベントにカーソルを移動してみてください。画面下部のステータスバーに、簡単な説明が表示されますので、それを参考に色々試してみましょう。



 

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