こんにちはmasalifeです。
今回はDCount関数を使った入力フォームの一例を紹介します。
作成する入力フォームのイメージは次のとおりです。
来店入力フォームで入力した顧客名が顧客名簿テーブル(T_顧客名簿)にあった場合は来店情報の登録と同時に顧客名簿登録フォームを開き、なかった場合は来店情報の登録のみを行う機能を作成します。
この機能を作ってみたいなと思った方はぜひ最後まで読んでください。
・DCount関数
・Ifステートメント+Else節
・DoCmd.GoToRecordメソッド
・DoCmd.OpenFormメソッド
準備するもの
テーブル
来店情報を管理するテーブル「T_来店管理」
顧客情報を管理するテーブル「T_顧客名簿」
フォーム
来店情報を入力するフォーム「F_来店入力」
顧客情報を入力するフォーム「F_顧客名簿」
クリックで拡大表示
VBAコード
来店情報を入力するフォーム「F_来店入力」のテキストボックス「txt顧客名」の更新後処理イベントに次のVBAコードを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Private Sub txt顧客名_AfterUpdate() Dim c As Integer c = DCount("*", "T_顧客名簿", "顧客名=txt顧客名") If c = 0 Then DoCmd.GoToRecord MsgBox "顧客名簿に登録をしてください!!" DoCmd.OpenForm "F_顧客名簿", , , , acFormAdd Else DoCmd.GoToRecord End If End Sub |
・顧客名が入力された後にその値が顧客名簿に存在するかによって条件分岐させるためです。
・入力された顧客名にチェックを行わないため、更新前処理ではなく更新後処理イベントに設定します。
VBAコードを考える
DCount関数を使って、入力した顧客名と一致するレコード件数を取得する
3 4 5 |
Dim c As Integer c = DCount("*", "T_顧客名簿", "顧客名=txt顧客名") |
3 Dim c As IntegerはDCount関数を使って取得したレコード件数を代入する変数を宣言しています。
変数は整数を取り扱いため、Integer型(整数)とします。
5 c = DCount(“*”, “T_顧客名簿”, “顧客名=txt顧客名”)はDCount関数を使って、テーブル(T_顧客名簿)の顧客名フィールドとテキストボックス(txt顧客名)に入力した値が一致するレコード件数を取得し、変数cに代入しています。
DCount関数の概要は次のとおりです。
※以下、Microsoftサポートより引用
【DCount関数】
指定したレコード セット (ドメイン) 内のレコード数を確認できます。
【構文】
DCount(expr , domain [, criteria] )
【引数】
引数 | 説明 |
expr | 必須。 レコード数をカウントするフィールドを識別する式。 テーブルやクエリ内のフィールドを識別する文字列式であることもあれば、対象フィールド内のデータに対して計算を実行する式である場合もあります。 |
domain | 必須。 定義域を構成するレコード セットを識別する文字列式。 テーブル名の場合もあれば、パラメーターを必要としないクエリのクエリ名の場合もあります。 |
criteria | 省略可能です。 DCount関数が実行されるデータの範囲を制限するために使用される文字列式。 |
今回の例で引数を整理すると、次のとおりとなります。
補足として、exprに”*”を指定することで、Nullフィールドがあるレコードを含めて、レコードの合計数を計算しています。
“*”を指定しない場合はNull値が入ったレコードは集計の対象から除かれます。
変数c(DCount関数で取得したレコード件数)の値で処理を分岐する
7 8 9 10 11 12 13 14 |
If c = 0 Then DoCmd.GoToRecord MsgBox "顧客名簿に登録をしてください!!" DoCmd.OpenForm "F_顧客名簿", , , , acFormAdd Else DoCmd.GoToRecord End If |
IfステートメントにElse節を用いて、条件を満たす場合と満たさない場合に条件を分岐し処理をしています。
処理をフローチャートにすると、次のとおりとなります。
次のレコードへ移動するために、DoCmd.GoToRecordメソッドを使用しています。
次のレコードに移動させるだけであれば、すべての引数を省略で大丈夫です。
顧客名簿登録のフォームを開くのに、DoCmd.OpenFormメソッドを使用しています。
今回は新規で登録するためにフォームを開く必要があるので、第5引数を追加モード(acFormAdd)にしています。
追加ではなく、特定のレコードのフォームを開きたい場合は以下にまとめてありますので参考にしてください。
覚えるとかなり便利です。
こんにちはmasalifeです。 今回はDoCmd.OpenFormメソッドを使って特定のレコードの単票フォームを開く方法を紹介します。 具体的には次のような機能を構築します。 DoCmd[…]
さいごに
Ifステートメントの中を変えれば様々な制御をかけれるので、ぜひ基本形のこのパターンを覚えてほしいなと思います。
最後まで読んでいただきありがとうございました。