MS Access Tips/Sample and VBA and Blog customize etc...

共通Functionでイベントをキャンセルする

Access Club の掲示板で下記のような質問がありました。

複数のコントロールの入力チェックをするため共通Functionを作成して「更新前処理」プロパティに設定しましたが、イベントのキャンセルができません。どのような関数にすればいいでしょうか。

オリジナルは、キャンセルが働きません

各コントロールのイベントで同様の処理をしたいとき、Finctionにしてイベントプロパティに =関数名() と設定するというのは、お手軽で私はよく使います。複数のコントロールに設定したいときでも複数選択しておいて一度に設定できます。

ただ、この方法だとイベントの引数が使えないのが困りものです。Cancel とか、Button とか、KeyCode とかの引数を使いたいときは、クラスモジュールを使うことになります。クラスモジュールは強力なのですが、ちょっと記述が面倒だったりしますので二の足を踏むところがあります。

しかし、共通Functionでもイベントのキャンセルだけは、可能です。

難易度:

上記の掲示板の質問の内容に合わせて、仕様を決めます。

  1. 日付として正しくなかったら、更新をキャンセルして再入力を即す。
  2. 入力した日付が土日だったら、土日でいいか確認メッセージを出す。
  3. メッセージで「はい」をクリックしたらそのまま保存、「いいえ」をクリックしたら、更新をキャンセルして再入力を即す。
  4. 複数のコントロールに共通Functionとして設定する。

更新前処理イベントプロシージャ内なら、Cancel = True でイベントをキャンセルできます。

複数のテキストボックスに同じチェックをしたいときは、下記のように共通Subにすればいいでしょう。Cancel引数は、共通Subには、参照渡しで渡せば、イベントプロシージャと同じコードにできます。

共通化するときは、コントロールを参照する部分は、ActiveControlプロパティを使います。

複数のフォームでも利用したい場合は、共通Sub は標準モジュールに記述して、Public宣言すればいいでしょう。

ただ、やはり、BeforeUpdateプロシージャはコントロールの数だけ記述しなければなまりせん。Functionにすれば、更新前処理プロパティに、=土日チェック() と設定するだけですので楽です。が、上記のコードの Sub を Function に直しただけでは、Cancel = True でイベントキャンセルできません。上記の掲示板の質問でも同じ悩みにぶつかっています。

しかし、イベントキャンセルの方法はこれだけではありません。マクロにも「イベントのキャンセル」があります。また、VBAにもそれと同等のメソッド DoCmd.CancelEvent があります。ということで、

と標準モジュールに記述して、テキストボックスの更新前処理に =土日チェック() と設定すればOKです。


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/232-5295f169
該当の記事は見つかりませんでした。