こんにちはmasalifeです。
今回はDoCmd.OpenFormメソッドを使って特定のレコードの単票フォームを開く方法を紹介します。
具体的には次のような機能を構築します。
DoCmd.OpenFormメソッドの引数、WhereConditionにWhere句を指定することで構築出来ますが、Access初学者にとっては、Where句という部分を難しく感じると思います。
(自分が実際にそうでした・・・)
まずは、今回紹介する基本的なパターンで感覚を掴んでいただければ、実際のシステム構築で十分役立てるので、ぜひ最後まで見ていってください。
*方法のみを知りたい方は【目次2:特定のレコードの単票フォームを開く機能を実装する】のみを見てください。
・DoCmdOpenFormメソッド
・DoCmdOpenFormメソッドの引数【WhereCondition】
準備するもの
テーブル(T_来店情報_累積ID付)
同様のテーブルを任意に作成してください。
ただし、重複していない一意となる値のフィールドは必ず作成する必要があります。
とても重要なポイントです。
オートナンバー型のフィールドや主キーを付けているフィールドは一意となるフィールドの代表例となります。
フォーム
【一覧画面となる帳票フォーム(F_来店者情報検索)】
準備したテーブル(T_来店情報_累積ID付)をレコードソースとした帳票フォームを作成します。
【個別画面となる単票フォーム(F_備考入力)】
準備したテーブル (T_来店情報_累積ID付) をレコードソースとした単票フォームを作成します。
特定のレコードの単票フォームを開く機能を実装する
一覧画面(F_来店者情報検索)の特定のレコードの備考欄をダブルクリックすることによって、該当の個別画面(F_備考入力)を開く仕様とするため、
【備考】のコントロールのイベントにVBAを記述します。
F_来店者情報検索をデザインビューで開いて、
【備考】コントロールのプロパティシートを出します。
【イベント】タブの【ダブルクリック時】の【…】アイコンをクリックします。
【コードビルダー】を選択し、【OK】ボタンをクリックします。
VBE画面が起動します。
DoCmd.OpenForm “F_備考入力”, , , “[T_来店情報_累積ID付]![ID] = [Forms]![F_来店者情報検索]![txtID]”
と記述します。
これで機能の実装が終了です。
試しに、ID11のレコードをダブルクリックすると、
ID11のレコードが単票フォームで開かれます。
WhereConditionの引数である、”[T_来店情報_累積ID付]![ID] = [Forms]![F来店者情報検索]![txtID]”の指定が誤っています。正しく記述出来ているか再度確認してください。オリジナルのテーブルやフォームで試している方は【目次3:DoCmd.OpenFormメソッドを考える】を参考にしてみてください。
DoCmd.OpenFormメソッドを考える
今回記述したDoCmd.OpenFormメソッドを考えてみましょう。
引数 | 今回の引数 | 説明 |
フォーム名 | F_備考入力 | 開くフォーム名 |
ビュー | (省略) | (省略すると)フォームビューで開く |
フィルタ名 | (省略) | (指定しない) |
フィルタ 条件式 | “[T_来店情報_累積ID付]![ID] = [Forms]![F_来店者情報検索]![txtID]” | SQLを文字列式で 指定 |
今回のポイントは4つ目の引数のフィルタ条件式(WhereCondition)です。
ただ、F_備考入力のフォームを開くだけでなく、どのように開くかを指定しています。
引数にはSQLを文字列式で指定することになるのですが
SQL??となってしまうので、
レコードを抽出する条件式を指定すると簡単に考えてもらうのがいいと思います。
今回の例を言語化すると、
「T_来店者情報累積ID付のテーブルにあるIDフィールドとF_来店者情報検索フォームにあるtxtIDコントロールの値が一致するレコードをF_備考入力(単票フォーム)を開いたときに表示させたい」
といった感じになります。
言語化出来たら、
一致なので、比較演算子「=」を用いて、言葉にはめていけば条件式の完成です。
WhereConditionに指定するフィールドは一意の値が格納されているフィールドを指定してください。
上記の例で、IDフィールドに同じ値が存在していた場合、表示したいレコードと異なる単票フォームを開いてしまう事があるからです。(複数存在した場合は、レコード番号が小さいものから表示)
もし、一意のキーとなるフィールドがない場合は、異なるフィールドを連結するなどして、作成しておくと効果的です。
・””(ダブルクォーテーションで)囲む
・演算子を用いる
・演算子「=」の左辺と右辺は入れ替えても問題ない
・一意の値が格納されているフィールドを使用する
さいごに
いかがでしょうか。
WhereConditionの構文を言語化してみると、難しい事ではないと感じていただければしてやったりという気持ちです。
この機能を使って、システムの質やユーザビリティが高まれば幸いです。
最後まで読んでいただきありがとうございました。