ACCESS クエリだけで検索フォームを作る方法(VBA未使用)

クエリだけで検索フォームを作る方法

ACCESSでもっともよく作成するフォームは検索フォームではないでしょうか。

この検索フォーム、作成する方法は何種類もあります。
最も自由度が高いのはVBAを使って作成する方法ですが、VBAはちょっと難しそうで・・・という方も多いと思います。

そんな方のために、VBAを使用せずにクエリだけで検索フォームを作成する方法をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。

完成形

最初に、完成形を示します。

下記のように売上日と顧客名で売上を検索するフォームです。

例えば、売上日を指定して検索ボタンを押すと下記のように、該当期間中の売上のみが抽出できます。

また。顧客名を指定すると、指定した文字列を含む顧客名のレコードが部分一致で抽出できます。

以降、このフォームの作成方法を見ていきましょう。

テーブルの作成

初めに、フォームの抽出対象となるテーブルを作成します。

今回は下記のフィールドレイアウトでテーブルを作成しました。

データシートビューで見てみると、下記のデータが入力してあります。

このデータをフォームを使って検索できるようにしていきます。

クエリの作成

次に、先ほどのテーブルを基にしたクエリを作成します。

このクエリを検索フォームのレコードソースにします。

売上検索フォームに表示するフィールドを選択してクエリの下部(デザイングリッド)に配置していきます。

顧客名で検索を行いたいのですが、TRN_売上には顧客IDのみしかないため、「テーブルの追加」からMST_顧客テーブルを追加したうえで、TRN_売上とMST_顧客を顧客IDでリレーション設定します。

そのうえでMST_顧客から顧客名をデザイングリッドに配置します。

今回は売上日と顧客名でレコードの抽出を行いますので、この2つのフィールドはデザイングリッド部分に抽出条件が設定されています。
この抽出条件設定は、フォームを作成した後に設定しますので、説明は後述します。

フォームの作成

次に検索結果を表示するフォームを作成します。

メニューから「作成」→「フォームウィザード」を使用して作成しましょう。

先ほど作成したクエリをレコードソースに選択し、選択可能なフィールドからすべてのフィールドを「>>」ボタンで選択したフィールドへ移します。

次にフォームのレイアウトを聞かれます。
今回は、複数のレコードを一覧表示する形にしたいので、「表形式」を選択しましょう。

今回選択した表形式はレコードが一覧表示されるExcelのようなフォームです。
一方、単票形式は1レコードの値が1画面に表示されます。

ウィザードでフォームが作成されました。

これを基に見栄えを修正して、下記のようなフォームにしています。

検索条件はフォームヘッダーに、非連結のテキストボックスを作成しています。

売上日検索のコントロール名は、「売上日検索FROM」と「売上日検索TO」、顧客名検索のコントロール名は「顧客名検索」です。
フォームのコントロール名は、VBAやクエリでの呼び出し時に使用するので、わかりやすい名前を付けておきましょう。

テキストボックスを新規作成すると「テキスト1」のような名前になりますが、そのままだと後でどのテキストボックスかわからなくなるので変更することをお勧めします。

クエリの抽出条件設定

それでは、クエリの抽出条件設定に戻ります。

売上日(期間指定)

先ほど作成したクエリをデザインビューで開いて、売上日の抽出条件欄を選択します。

抽出条件はここに直接書き込んでも良いですが、複雑な条件を記載する場合はビルダーを使用すると便利です。

ビルダーはACCESSのメニューの「クエリデザイン」から「ビルダー」ボタンで起動できます。

今回はビルダーで下記の条件を設定します。


 >=[Forms]![test_売上検索]![売上日検索FROM] And <=[Forms]![test_売上検索]![売上日検索TO]
 

売上日が、test_売上検索フォームの売上日検索FROMよりも大きく、かつ、test_売上検索フォームの売上日検索TOよりも小さい、という抽出条件になっています。

[Forms]![test_売上検索]の部分が、フォームのコントロールを参照している箇所です。
この部分は手入力しなくても、式ビルダーの下段部分で選択することが可能です。

上記のように、「式の要素」で検索フォームを指定すると、「式のカテゴリ」にそのフォームにあるコントロールが一覧表示されます。
その中から値を参照するコントロール(今回は売上日検索FROM)を選択し、「式の値」で値を選択すると、上段の式に自動的に文字が入力されます。

これで売上日の期間指定はできました。

顧客名(テキスト部分一致)

次に顧客名の抽出条件を設定します。
クエリのデザインビューで「顧客名」の抽出条件にカーソルを合わせて、ビルダーをクリックします。

なお、この際、先ほど作成した売上日の抽出条件と同じ行に条件を記載すると、売上日および顧客名をAnd条件(かつ)で抽出します。
売上日と行をずらして記載すると、Or条件(または)で抽出しますので注意してください。

上記の図では抽出条件を同じ行に記載しているのでAnd条件になっていることが分かります。

先ほどと同様に、ビルダーで抽出条件を以下のように設定します。


 Like ("*" & [Forms]![test_売上検索]![顧客名検索] & "*")
 

Likeを使ってあいまい検索の条件設定をします。
フォームの値を呼び出す部分は先ほどの売上日と同じですが、前後に「*」を付けて部分一致(あいまい検索)にしている部分に注意ください。

また、VBAでLikeを使う場合とは記載方法が異なるので、この点も注意です。
Like演算子の使い方は以下の記事にも書いてありますので、興味がある方はご覧ください。

Like演算子であいまい検索する方法

これで顧客名のあいまい検索もできるようになり、クエリの抽出条件設定が完了しました。

検索ボタンの作成

ここまででクエリとフォームの設定は完了しました。

最後に、検索ボタンの作成をします。

クエリだけで検索フォームを作成する、というテーマなのですがここだけはどうしてもVBAを使用させてください。
ただし、とても簡単な記述ですので、初めての方でもできると思います。

まず、なぜ検索ボタンを設置するか、についてです。

単純に操作上わかりやすい、ということもありますが、実はフォームで検索をする場合はフォームで入力した抽出条件に合わせて、リアルタイムにはクエリの結果が反映されない、という課題があります。

例えば、下記のようにフォームの検索条件に日付を指定しました。
しかし、現時点ではフォームにレコードが表示されていません。

一方で、この状態で直接、フォームのレコードソースになっているクエリを開くと、レコードが1件表示されます。

フォームは、レコードソースのクエリの結果を表示しているので、フォームにも1件表示されないとおかしいですよね?
これは、フォーム側の表示が最新化されていないため、クエリの計算結果を反映できていないのです。

そこで、検索条件を入れた後にフォームの表示を最新化するボタンを設置します。それが今回の検索ボタンです。

それでは作成方法を見ていきましょう。

フォームをデザインビューで開き、検索ボタンを選択した状態で、右側のプロパティシートのイベントタブを開きます。
クリック時イベントを選択して、一番右の「…」ボタンを押してイベントプロシージャを設定します。

ビルダーの選択ウィンドウが表示されますので、コードビルダーを選択して、OKを押します。

コードビルダー

すると、Visual Basic Editorが立ち上がります。
Visual Basic EditorとはACCESSなどのVBAをプログラミングするための画面です。

現在、Private Sub 検索_ボタン_Click()という部分にカーソルがあるはずですので、End Subとの間に下記のように記載します。


 DoCmd.Requery
 

DoCmd.Requeryは、クエリを最新化せよ、という命令文です。
これだけでOKですので、保存してVisual Basic Editorを閉じましょう。

改めて、フォームをフォームビューで開き、検索条件を入れて「検索」ボタンを押してみましょう。

今回は無事に結果が表示されるはずです。

このように、クエリだけでも検索フォームを作成することは可能です。

ただ、どうしても複数の検索条件を組み合わせて、さらにAnd条件やOr条件を複雑に設定することはクエリだけでは難しくなります。
はじめはクエリで検索フォームを作成し、物足りなくなったらVBAでの検索フォームに挑戦するのがよいでしょう。

VBAでの検索フォーム作成は以下の記事をご参照ください。

ACCESS 検索フォーム作成方法

以上、クエリだけで検索フォームを作成する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。