ACCESS VBA ダブルクリックによってクリックイベントの処理が2回実行されてしまう件
はじめに
ある入力画面フォームで登録ボタンを用意、クリックイベントの処理(イベントプロシージャ)でデータベースに登録する処理を割り当てました。運用になってからしばらくは順調に動作していましたが、複数の担当者の内、ある人が操作した時に、データが2重登録されるケースが出現。
原因について
どうやら、その担当者は登録ボタンをダブルクリックしていて、クリックイベント処理が2回走ってしまったことが原因らしい。
改めてACCESSのヘルプを見直すと、
Form.DblClick イベント (Access)
https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/form-dblclick-event-access
■マウス イベントを受け取るオブジェクトに対しては、次の順序でイベントが発生。
MouseDown ⇒ MouseUp ⇒ Click ⇒ DblClick ⇒ MouseUp
■コマンド ボタンをダブルクリックすると、次の順序でイベントが発生。
MouseDown ⇒ MouseUp ⇒ Click ⇒ DblClick ⇒ MouseUp ⇒ Click
との事。
今回のケースは、コマンドボタンをDblClickした場合なので、Clickイベントが2回発生した。
そもそも、DblClickの時にClickイベントが発生する事など、全く考えていなかったので、この仕様には驚いています。ただ、今回の事を知って改めて考えると、パソコンの設定によってDblClickとClickの判断は難しい場合があるのだと思えば、なんとなく納得しています。
対応方法
2回目のClickイベントを無効にする次の方法で対応します。
DblClickイベントプロシージャの引数に「Cancel」があるので、この引数にtrueを設定して終了すれば、以降のClickイベントは発生しません。
例)
Private sub XXXボタン_DblClick(Cancel As Integer)
Cancel = true
End sub
おわりに
入力画面を設計する際、GUIの観点からなるべく入力を簡単にできるよう考えます。
例えば、テキストボックスをダブルクリックするとデフォルトの値が設定されるようにするとか。
結果として、クリック操作とダブルクリック操作が混在する画面の操作性の良し悪しは、
判断が分かれるところですが、今回のようなケースでうっかり操作による誤動作の対応はしておきましょう。
なお、Accessのヘルプには、
”一般的には、コマンドボタンをダブルクリックしない事をお勧めします”
とありました。