Access検索フォームの作り方をお探しですね。

広告

Accessで便利な検索フォームを作ろう!実務で使える作り方ガイド

Accessで顧客管理や在庫管理をしていると、「名前の一部だけで探したい」「日付と担当者を組み合わせて絞り込みたい」「毎回クエリを開かずに、画面上で検索したい」と思うことがよくあります。

検索フォームを作っておけば、Accessに詳しくない人でも、テキストボックスやコンボボックスに条件を入力するだけで、必要なデータをパッと見つけられるようになります。

この記事では、Access検索フォームの作り方を基本から整理して、複数の条件やあいまい検索を実務で使いやすく組み込む方法まで解説していきます。

見出し1:検索フォームの基本設計と作り方

Access検索フォームを作るときは、まず「どのテーブルやクエリを検索対象にするか」を決めるところから始めましょう。

たとえば顧客管理なら、顧客ID、顧客名、電話番号、住所、担当者、登録日などが入った顧客テーブルや顧客一覧クエリを用意します。

フォームは、データを直接編集する画面ではなく、検索条件を入力して結果を表示する画面として作るのがポイントです。

こうすることで、間違って入力したり、意図せずデータを変更してしまったりするのを防げます。

基本的な構成は、検索条件を入力する非連結のテキストボックスやコンボボックス、検索を実行するボタン、そして結果を表示するサブフォームやリストボックスを配置する形になります。

「非連結」というのは、テーブルのフィールドに直接結び付いていないコントロールのことです。

検索キーワードを一時的に入力するだけなので、コントロールソースは空欄にしておくのが一般的です。

たとえば、顧客名検索用に「txt顧客名」、担当者選択用に「cbo担当者」、開始日と終了日用に「txt開始日」「txt終了日」といった名前を付けておくと、後からクエリやVBAで参照するときに分かりやすくなります。

検索結果の表示には、サブフォームを使うのがおすすめです。

メインフォームに検索条件を置いて、下の方に一覧形式のサブフォームを配置すれば、ユーザーは同じ画面内で条件入力と結果確認ができます。

サブフォームのレコードソースには、検索対象のテーブルそのものではなく、必要なフィールドだけを選んだ選択クエリを設定しておくと管理が楽になります。

まずは条件なしで全件表示できる状態を作って、その後にフォームの入力値で絞り込む仕組みを追加していくと、どこでエラーが起きているのか分かりやすくなります。

見出し2:複数条件で検索するクエリの考え方

複数の条件で検索するときは、「すべての条件を満たすデータを出す」のか、「どれか一つでも条件に合うデータを出す」のかをはっきりさせる必要があります。

Accessのクエリでは、同じ行に条件を書くとAND条件(すべて満たす)、別の行に条件を書くとOR条件(どれか一つでも満たす)として扱われます。

たとえば、顧客名に「田中」が含まれていて、担当者が「佐藤」で、登録日が指定期間内という検索はAND条件です。

一方、東京都または神奈川県の顧客を探すような検索はOR条件になります。

検索フォームでは実務上、AND条件を基本にして、必要に応じて一部だけOR条件を使う設計にすると分かりやすいです。

クエリの抽出条件にフォームの値を直接参照する場合は、こんな考え方を使います。

顧客名が入力されていればその文字を含むデータだけを抽出して、未入力なら条件を無視して全件を対象にします。

Accessのクエリデザインで顧客名フィールドの抽出条件に、`Like “*” & [Forms]![frm検索]![txt顧客名] & “*”` と書くと、部分一致のあいまい検索になります。

ただし、このままだと空欄のときの扱いが環境や条件によって分かりにくくなることがあるので、実務では「空欄なら条件をかけない」という判定を明示する方が安全です。

代表的な条件式は、次のように考えると整理しやすくなります。

| 検索項目 | 条件の例 | 目的 |
|—|—|—|
| 顧客名 | `([Forms]![frm検索]![txt顧客名] Is Null Or [顧客名] Like “*” & [Forms]![frm検索]![txt顧客名] & “*”)` | 未入力なら全件、入力ありなら部分一致 |
| 担当者 | `([Forms]![frm検索]![cbo担当者] Is Null Or [担当者ID]=[Forms]![frm検索]![cbo担当者])` | コンボボックスで選んだ担当者だけ抽出 |
| 登録日 | `([登録日] Between [Forms]![frm検索]![txt開始日] And [Forms]![frm検索]![txt終了日])` | 指定期間内の日付を抽出 |

日付検索では、開始日だけ入力したり、終了日だけ入力したりするケースも考えておくと実用性が上がります。

たとえば開始日が空なら古い日付から、終了日が空なら十分未来の日付までを対象にするよう、Nz関数を使って補完する方法があります。

`Between Nz([Forms]![frm検索]![txt開始日],#1900/1/1#) And Nz([Forms]![frm検索]![txt終了日],#9999/12/31#)` のように書けば、片方だけ入力された場合でも検索できます。

ただし、日付型フィールドに文字列が混ざっていると正しく比較できないので、テーブル設計の段階で日付は日付/時刻型にしておくことが大切です。

見出し3:あいまい検索を使いやすくする実践テクニック

Accessであいまい検索を行う中心になるのが、Like演算子とワイルドカードです。

通常のAccessクエリでは、任意の文字列を表すワイルドカードに「*」を使います。

たとえば `Like “*山田*”` なら、顧客名の前後どこかに「山田」を含むレコードが対象になります。

前方一致なら `Like “山田*”`、後方一致なら `Like “*山田”` と書きます。

なお、Accessの設定や接続方式によってはANSI-92形式となり、ワイルドカードが「%」になる場合があります。

通常のAccessファイル内のクエリでは「*」を使うことが多いですが、SQL Server連携やADO利用時は違いに注意してください。

あいまい検索を実務で使いやすくするには、ユーザーが入力する表記のゆれを想定しておくことも重要です。

たとえば会社名では「株式会社」を付ける場合と省略する場合、住所では全角数字と半角数字、電話番号ではハイフンありとなしが混在しがちです。

すべてをクエリ条件だけで吸収しようとすると複雑になるので、登録時のデータ整備と検索時の補助処理を分けて考えると安定します。

電話番号検索なら、テーブル側にハイフンなしの検索用フィールドを持たせるか、クエリでReplace関数を使ってハイフンを除去して比較する方法があります。

VBAで検索条件を組み立てる方法も、複数条件やあいまい検索では便利です。

フォームの検索ボタンをクリックしたときにWHERE句を作って、サブフォームのFilterまたはRecordSourceに反映します。

たとえば顧客名が入力されている場合だけ条件を追加して、担当者が選択されている場合だけ条件を追加するようにすれば、空欄条件を無理にクエリへ書き込む必要がありません。

文字列条件を作るときは、シングルクォーテーションを含む入力でエラーが出ないよう、`Replace(入力値, “‘”, “””)` のようにエスケープ処理を入れると安全です。

簡単な例として、検索ボタンにこんな考え方を組み込めます。

まず `strWhere` という文字列変数を用意して、顧客名が空でなければ `顧客名 Like ‘*キーワード*’` を追加します。

担当者が選ばれていれば `担当者ID=選択値` を追加して、日付が入っていれば登録日の範囲条件を追加します。

最後にサブフォームへ `Me!sub検索結果.Form.Filter = strWhere`、`Me!sub検索結果.Form.FilterOn = True` のように反映します。

クエリにすべての条件を書く方法よりも、どの条件が使われているかをコード上で確認しやすいので、検索項目が多いフォームほどVBA方式が向いています。

見出し4:検索フォームを実務で安定して使うための注意点

検索フォームは作って終わりではなく、実際に使う人が迷わず検索できて、データ量が増えても遅くなりにくい状態にしておくことが大切です。

まず意識したいのは、検索対象フィールドへのインデックス設定です。

顧客ID、担当者ID、登録日など、完全一致や範囲検索でよく使うフィールドにはインデックスを設定すると検索速度の改善が期待できます。

一方で、`Like “*キーワード*”` のような前方にワイルドカードを付けた部分一致検索は、インデックスが効きにくい場合があります。

大量データで検索が遅い場合は、前方一致にできないか、検索用フィールドを別途作れないかを検討するとよいでしょう。

入力チェックも欠かせません。

日付欄に日付以外の文字が入った状態で検索すると、型不一致エラーが発生することがあります。

検索ボタンを押したときに、開始日と終了日が日付として正しいか、開始日が終了日より後になっていないかを確認する処理を入れておくと、利用者にとって分かりやすいフォームになります。

また、条件をすべて空欄にした場合に全件表示するのか、件数が多すぎるため検索を促すのかも決めておきましょう。

数万件以上のデータを毎回全件表示すると、フォームの表示が重くなる原因になります。

使いやすさの面では、検索ボタンだけでなく、条件クリアボタンを用意しておくと便利です。

条件クリアボタンでは、各テキストボックスやコンボボックスをNullに戻して、サブフォームのフィルターを解除します。

さらに、よく使う条件にはコンボボックスを使って、手入力を減らすと検索ミスが少なくなります。

担当者、分類、ステータスなど、候補が決まっている項目はプルダウンにするのが基本です。

テキストボックスによる自由入力と、コンボボックスによる選択式を組み合わせることで、柔軟さと正確さを両立できます。

Access検索フォームの作り方で大事なのは、最初から複雑な機能を詰め込むことではありません。

まずは検索対象のクエリを作って、非連結フォームに条件入力欄を配置して、サブフォームへ結果を表示する基本形を完成させます。

そのうえで、Like演算子によるあいまい検索、AND条件による複数条件検索、日付範囲検索、VBAによる動的なWHERE句作成へと段階的に拡張していくと、保守しやすい検索画面になります。

顧客管理、在庫管理、売上管理など、Accessを業務で使う場面では検索性が作業効率を大きく左右します。

使う人の入力パターンとデータ量を意識して設計すれば、日々の確認作業を大きく短縮できる実践的な検索フォームを作ることができます。

広告