2017年10月12日木曜日

Access VBA でイベントに関数を登録

MicroSoft Access の話題です。

フォームに大量のボタンを配置した場合など、それぞれのボタンのクリックイベントを書いていると結構邪魔くさい。

例えば、月単位のカレンダーを表示して、特定の日付をクリック(もしくはダブルクリック)したら、その日の詳細を表示するフォームがポップアップするなどのプロシージャを書きたい場合など。
実際には押された日付を取得できれば、あとは同じ処理になるので、プロシージャ自体は非常に簡単だけど、
普通にかいたら、最低でも31個のClickイベントを書かなければならない。
これは非常に邪魔くさい。

そこで、すべてのコントロールを選択(SHIFTを押しながら選択)して、「クリック時」イベントに「=ユーザー関数」を書けば、一発で登録できる。

コントロールの名前を「日付」にしておけば、
Screen.ActiveControl.Name」でそのコントロールの名前を取得できるので、
押された日付が取得できる。

実際には
--------------------------------------------------------------
Function UF_PCall()
    Call R_Main
End Function

sub R_Main()
    V_条件 = Screen.ActiveControl.Name
    Docmd.OpenForm "F_PopUp",,,日付 = " & V_条件
End Sub
--------------------------------------------------------------

こんな感じのプロシージャを書いておいて、
フォームの日付フィールドを複数選択して、
そのクリック(もしくはダブルクリック)イベントに、
「=UF_PCall()」
と書けば、一発登録完成です。

今更ながら、イベントプロシージャに関数を書くというのは、目から鱗でした。

応用編として、コントロールの名前が取得できるなら、
    me.Control(取得した名前).Value
などとすれば、値を取得することも可能になるし、
    set obj_CTRL =  me.Control(取得した名前)
とすれば、あとは、
    obj_CTRL.Value
でも、
    obj_CTRL.BackColor
でも、そのコントロールのプロパティーを簡単に操作できますね。