#782 複数コントロールのイベントプロシージャを1ケ所に集約するには? フォーム、VBA

複数のコントロールのあるイベントの処理内容がほぼ同じような場合、「VB.NET」では「Handles」句に「コントロール名.イベント名」を列挙することで、1つのプロシージャにそれらを集約して記述することができます。

■コントロールごとにイベントプロシージャを書く場合

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  MessageBox.Show("Button1がクリックされました!")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  MessageBox.Show("Button2がクリックされました!")
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  MessageBox.Show("Button3がクリックされました!")
End Sub


■1つのプロシージャに集約して書く場合

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
  MessageBox.Show(sender.Name + "がクリックされました!")
End Sub



それに対してAccessの「VBA」ではそのようなHandles句の機能はないため、コントロールごとにイベントプロシージャを記述する必要があります。

Private Sub cbo従業員1_AfterUpdate()
  Me!txt氏名1 = Me!cbo従業員1.Column(1)
End Sub
Private Sub cbo従業員2_AfterUpdate()
  Me!txt氏名2 = Me!cbo従業員2.Column(1)
End Sub
Private Sub cbo従業員3_AfterUpdate()
  Me!txt氏名3 = Me!cbo従業員3.Column(1)
End Sub
Private Sub cbo従業員4_AfterUpdate()
  Me!txt氏名4 = Me!cbo従業員4.Column(1)
End Sub
Private Sub cbo従業員5_AfterUpdate()
  Me!txt氏名5 = Me!cbo従業員5.Column(1)
End Sub

しかし、イベントプロシージャではなく、プロパティシートの方の「イベント」プロパティを利用することで、モジュールに関しては1ケ所のプロシージャにコードを集約することができます。

それには、次のようにします。
  1. Functionプロシージャを作り、そこに各コントロール共通の処理を記述します。
    例:

    Private Function ComboAfterUpdate()

      Dim intActiveCtlNo As Integer

      'アクティブなコンボボックスの名前の末尾の数字を取得
      intActiveCtlNo = Right(ActiveControl.Name, 1)

      'その数字を使ってテキストボックスに代入
      Me("txt氏名" & intActiveCtlNo) = ActiveControl.Column(1)

    End Function

    • プロシージャの引数としてはどのコントロールから呼び出されたかということは取得できませんので、ここでは”その時点でアクティブになっているコントロールでイベントが発生した”と考え、「ActiveControl.Name」という部分でそのコントロールの名前を取得します。
    • テキストボックスへの代入式の右辺は、「Me("cbo従業員" & intActiveCtlNo).Column(1)」とすることもできます。

  2. 次に、プロパティシートにおいて、各コントロールの当該イベントの欄に上記のプロシージャを呼び出す式を記述します。

    • Functionプロシージャなので、「=ComboAfterUpdate()」のように先頭に「=」を付けて記述します。
    • またここでは引数はないので最後に「()」を付けますが、もし引数がある場合はコントロールごとの固定値となりますが「(1)」のような書き方もあります。
    • ここでは5つのコンボボックスの”更新後処理”イベント欄に記述します。またその際、すべてに同じ式を設定しますので、デザインビューで5つのコンボボックスをいっしょに選択したあとにプロパティシートに書き込むことで、一度でまとめて設定することができます。

実行例:




※参考Tips:「#783 イベントプロパティを動的に設定するには?」
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved