こんにちはmasalifeです。
今回はクエリを使って検索用フォームを作ってみたいと思います。
作る検索用フォームは次のイメージです。
フィルタとフィルタの解除機能だけというシンプルな検索フォームです。
クエリの抽出機能と簡単なVBAコードで作成できます。
クエリではなく、テーブルで作りたいという方はこちらの記事を参考にしてみてください。
それでは作っていきましょう。
・クエリのあいまい抽出
・更新後処理イベント
・Requeryメソッド(VBA)
準備するもの
検索対象の元となるテーブル
検索用のフォームに表示する元のテーブルは必ず必要です。
用意するテーブルは各自の使いやすいものを使用してください。
ただし、今回の場合は文字列の検索となるので、
検索対象のフィールドのデータ型は短いテキストとしてください。
フォームのレコードソースとなるクエリ
クエリを使って検索用フォームを作ることがテーマなので、
フォームのレコードソースとなるクエリが必要です。
【1.検索対象の元となるテーブル】で準備したテーブルを使ってクエリを作成しましょう。
フォームに表示したいフィールドを選択し、クエリを保存します。
特に注意する点はありません。
検索用フォーム
フォームのプロパティ
次の2点は必ず同じ設定をしてください。
・規定のビュー:帳票フォーム
今回はクエリを使った検索用フォームを作るので、クエリをレコードソースとします。
帳票フォームとすることで、データが一覧で確認でき、検索(フィルタ)の動作がつかみやすいです。
検索ワードを入力するテキストボックス
非連結のテキストボックスを作成します。
フィルタを解除するボタン
ボタンを作成します。
ボタンに表示する表題は自由に付けてください。
抽出機能を実装する
クエリを編集する
フォームのレコードソースにクエリを設定したため、フォームに表示されているデータはクエリのデータとなります。
そのため、クエリで抽出条件を設定すると、フォームに表示されるデータも影響を受けます。
今回の抽出機能はその特性を利用したものとなります。
それではクエリを編集していきましょう。
クエリをデザインビューで開きます。
来店者フィールドの抽出条件にLike “*” & [Forms]![F_来店者情報検索]![txt来店者検索] & “*”と入力します。
オリジナルのフォームを使用する場合は、
・ txt来店者検索の部分はテキストボックスの名前
としてください。
Like “*” & [Forms]![F_来店者情報検索]![txt来店者検索] & “*”の意味はフォームにあるテキストボックスに入力されている値を含む文字列を抽出するです。
来店者検索が一部の文字でもできるようにするために、このような抽出方法としました。
それと、詳細は省略しますが、フォームを開いたときにすべてのレコードが表示されるためでもあります。
これでクエリの編集が終了です。
クエリの抽出方法の知識に自信がない方はこちらを参考にしてみてください。
テキストボックスのイベントにVBAを記述する
検索ワードを入力するテキストボックスに検索(フィルタ)機能をVBAで設定します。
テキストボックスのプロパティシートを出して、
【イベント】タブの更新後処理の【…】アイコンをクリックします。
【コードビルダー】を選択し、【OK】ボタンをクリックします。
VBE画面が起動します。
・イベントは、オブジェクト(今回の場合はテキストボックス)に対してユーザーが行う操作などで発生します。
・更新後処理イベントはデータが入力され、データが確定した後に発生するイベントです。
・値がテキストボックスに入力された後にイベントプロシージャ(VBAコード)を実行するようにします。
Me.Requeryと記述します。
・Requeryメソッドは、指定したフォームの基になるデータを再クエリして更新します。 *Microsoftリファレンスから引用
・再クエリするフォーム内にRequeryメソッドが設定してあるオブジェクトがあるため、Meと指定します。(あのフォームじゃなくて、このフォームの場合はMeを使うという感じでいいと思います。)
これで抽出機能の実装が終了です。
試しに、抽出したい来店者の名前を入力して、Enterを2回押すなどしてデータを確定してみてください。
正しく結果が得られると思います。
フィルタの解除機能を実装する
ボタンのイベントにVBAを記述する
ボタンにフィルタ(抽出)の解除機能をVBAで設定します。
ボタンのプロパティシートを出して、
【イベント】タブのクリック時の 【…】アイコンをクリックします。
【コードビルダー】を選択し、【OK】をクリックします。
VBE画面が起動します。
Me.txt来店者検索 = “”
Me.Requeryと記述します。
*Requeryの説明については【目次:テキストボックスのイベントにVBAを記述する】に記載していますので参考にしてください。
これでフィルタの解除機能の実装が終了です。
抽出がかかった状態から、ボタンをクリックして動作を確認してください。
これで簡易的な検索用フォームの完成です。
お疲れ様でした。
抽出がかかる仕組みを考えてみる(まとめ)
おさらいも兼ねて、なぜ抽出がかかるのか考えてみましょう。
ポイントはフォームのレコードソースがクエリであることから、フォームに表示されているデータはクエリの実行結果とイコールということです。
例えば、フォームのテキストボックスに鈴木と入力すると、
フォームの元となっているクエリの抽出条件がLike “*鈴木*”になり、
更新後処理イベントに設定したイベントプロシージャのRequeryメソッド(クエリの実行)によって、クエリが実行されます。
その結果、フォームに表示されているデータはクエリの実行結果とイコールなので、
フォームに来店者が鈴木の抽出がかかるということになります。
それぞれのオブジェクトの特性を理解することにより、対応の幅が広がるので、なぜそのような動作になるのかを考える癖を付けましょう。
さいごに
日常業務でデータ管理をAccessでしている方はオリジナルの検索フォームを作ってみてはいかがでしょうか。
データを素早く見つけることができるため、業務の効率化に役立つと思います。
今回はクエリを使った検索フォームを作ってみましたが、テーブルを使っても同様の機能を作ることができます。
そちらもまた紹介していきたいなと思っています。
うまく説明できているか不安ではありますが、少しでも参考になれば嬉しいです。
最後まで読んでいただきありがとうございました。