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

複数項目の入力チェックを共通モジュール化する

フォーム上に複数の入力必須のテキストボックスがあります。各テキストボックス毎にチェックするコードを記述すると同じようのコードの繰り返しになりますので、これをコンパクトに記述できないでしょうか。また、他のフォームでも共通に使えるように共通モジュールにできないでしょうか。

このような要件は需要がありそうですね。掲示板の回答の確認用にサンプルを作成したので紹介します。

FrmRequiredControls.png

難易度:

サンプル仕様

社員データの新規登録用フォーム。フォームを開いた時に新規レコードへ移動する。(「データ入力用」プロパティを「はい」にするという仕様にしてもよい)

フォーム上には、登録、取消、閉じる のコマンドボタンがある。

社員コード, 氏名, フリガナ, 在籍支社, 部署名, 自宅郵便番号, 自宅都道府県, 自宅住所1 の各テキストボックス(or コンボボックス)が入力必須。

モジュール

標準モジュールに下記の関数を作成します。

キーワード ParamArray を使うと、任意の数の引数を渡すことができます。引数は、バリアント型配列として渡されます。よって、For Eachステートメントでループ処理できます。引数は、直接、コントロールオブジェクトを渡すようにします。

フォームで入力チェックする場合は、更新前処理で行うのがAccessでの基本です。例えば、登録ボタンのクリック時でチェックした場合、フォームを閉じたり、レコード移動しただけで保存されてしまうので、入力チェックをすり抜けてしまいます。更新前処理だと、そのような場合でもチェックできます。

フォームの更新前処理

Me は省略できるので、下記のように記述することもできます。

RequiredControls で未入力チェックをして、チェックに引っかかるコントロールがあれば、False を返しますので、Cancel = Not False となり、更新をキャンセルします。

登録ボタンでは、DoCmd.RunCommand acCmdSaveRecord でレコード保存をしますが、連鎖で更新前処理が発生します。そこで入力チェックされますが、チェックに引っかかって更新がキャンセルされると、保存できないのエラーが発生します。そこで、下記のようにエラートラップで対処します。

読み込み時や、その他のコマンドボタンのモジュールは下記のようになります。

共通モジュールの改良

未入力のテキストボックスが複数あった場合、メッセージでそれを列挙するように改良してみました。

サンプルファイルが下記からダウンロードできます。
FrmRequiredControls_07.zip (Access 2007-2010 形式 - 33kb)
FrmRequiredControls.zip (Access 2002-2003 形式 - 28kb)
FrmRequiredControls_2k.zip (Access 2000 形式 - 27kb)


拍手する

3 Comments

kurara says..."更新前処理 RequiredControls0"

Hatena様
はじめまして
とてもためになるサイトをいつもありがとうございます。
感謝しております。

こちらの記事の更新前で行う入力のチェック
についてご質問したくメールを致しました。
Private Sub Form_BeforeUpdate(Cancel As Integer)
With Me
Cancel = Not RequiredControls( _
.社員コード, .氏名, .フリガナ, .在籍支社, .部署名, .自宅郵便番号, .自宅都道府県, .自宅住所1)
End With
End Sub
テキストボックスで使用する、と文面にあったのに気が付かず、コンボボックスの名前を上記コードに入れてしまい、反応せず、色々確認したところ原因がコンボボックスだからではないかと思いました。(値リストに変更してみたところ、動いたためです。)
そこで仮のテキストボックスを作り、コンボボックスの値を指定してみたところ
今度は初めからゼロが表示されてしまい、やはり更新前の処理にひっかかりませんでした。
とても説明が下手で申し訳ありません。
コンボボックスの場合は、Hatena様に提示していただいた
モジュールは使用不可能なのでしょうか。
見当違い、的外れなご質問でしたら本当に申し訳ありません。

お忙しい所誠に恐縮ですが、ヒントをいただけたらありがたいです。何卒よろしくお願い申し上げます。

2014.03.30 16:42 | URL | #BxQFZbuQ [edit]
hatena says..."re:更新前処理 RequiredControls0"

> テキストボックスで使用する、と文面にあったのに気が付かず、コンボボックスの名前を上記コードに入れてしまい、反応せず、色々確認したところ原因がコンボボックスだからではないかと思いました。(値リストに変更してみたところ、動いたためです。)

コンボボックスでも問題なく動作します。
原因は他にあると思います。

が、提示された情報からだけでは原因はわかりません。

下記の情報を追加してください。

コンボボックスの値集合ソースの設定はどうなってますか。

また、コンボボックスと連結しているフィールドのデータ型はなんですか。

もし、テキスト型ならテーブルのデザインビューでフィールドの「空文字列の許可」を「いいえ」にしてみてください。

2014.03.30 22:19 | URL | #5uE6dEgY [edit]
kurara says..."動きました更新前処理 RequiredControls0"

Hatena様
早速のご返信を頂き誠にありがとうございます。

文がうまくかけないため、
結論から先に申し上げますと動きました。
大変嬉しいです。ありがとうございます。
ただし、やはり勘違いしているかもしれません。

下記が結果です。

コンボボックスの値集合ソースの設定
動かないと思っていたコンボボックスの名前は
コンボ会員区分
値集合タイプ テーブルクエリ
値集合ソース
SELECT T会員区分.ID, T会員区分.会員区分 FROM T会員区分;
列数2
列幅0㎝;3㎝
連結列1

値集合ソースのテーブル名は
T会員区分で
ID    オートナンバー
会員区分 テキスト型

コンボボックスと連結しているフィールドのデータ型は
(T会員区分 のID、オートナンバー型、と連結させているため)
会員区分 数値型にしていました。
そしてその会員区分をもう一度見たところ
既定値に0が入っていた為、それを消したところ動きました。

勘違いかもしれないと思い、再度、
新規フィールドを作り、
コンボボックスとつなげ(全く同じ設定にして)
テーブルのデザインビューにて
既定値ゼロを消したり入れたりしたところ
ゼロが入っていない時だけ動くようです。

いただいたお返事
    もし、テキスト型ならテーブルのデザインビューで
     フィールドの「空文字列の許可」を「いいえ」に
     してみてください。
の部分で、テーブルのデザインビューが数値型だった為
色々いじっているうちにゼロを消したら動いた!と思ってしまいました。

自分で文を書くといかにHatena様が簡潔に判り易く
書いてくださっているかがよくわかります。
反対に読みづらい文になっていることが申し訳なく、お詫び申し上げます。

どうぞよろしくお願い申し上げます。

2014.03.31 09:52 | URL | #BxQFZbuQ [edit]

Leave a reply






Trackbacks

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