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

ブログサムネイル_クエリだけで検索フォームを作る方法

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

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

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


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

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

目次

完成形

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

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

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

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

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

テーブルの作成

初めに、フォームの抽出対象となるテーブルを作成します。
今回は下記のフィールドレイアウトで売上情報を入力するTRN_売上テーブルを作成しました。

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

また、顧客情報を入力する、MST_顧客テーブルも作成しました。

TRN_売上とMST_顧客は顧客IDでリレーションさせています。
今回は、作成したTRN_売上テーブルのレコードをフォームを使って検索できるようにしていきます。

クエリの作成

次に、先ほどのテーブルを基にしたクエリを作成します。
このクエリは最終的に検索フォームのレコードソースになります。

デザインビューでクエリを作成しましょう。

クエリのデザインビュー

以下のようにクエリを作っていきます。

売上検索フォームで検索結果として表示するフィールドを選択してクエリの下部(デザイングリッド)に配置していきます。
今回は売上ID、売上日、顧客名、売上金額を表示しますので、その4つが選択されていますね。

また、検索条件に利用するフィールドもデザイングリッドに配置します。
今回は売上日と顧客名の2つです。
なお、顧客名で検索を行いたいのですがTRN_売上テーブルには顧客IDのみしかないため、「テーブルの追加」からMST_顧客テーブルを追加したうえで、TRN_売上とMST_顧客を顧客IDでリレーション設定します。

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

今回は売上日と顧客名でレコードの抽出を行いますので、この2つのフィールドには抽出条件を設定します。
この抽出条件は、フォームを作成した後で改めて設定しますので現在は空白のままです。

フォームの作成

次に検索結果を表示するフォームを作成します。
メニューから「作成」→「フォームウィザード」を使用して作成しましょう。

フォームウィザード

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

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

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

ウィザードでフォームが作成されました。
少し見栄えを修正して、下記のようなフォームにしています。

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

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

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

クエリの抽出条件設定

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

売上日(期間指定)

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

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

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

ビルダー

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


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

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

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

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

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

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

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

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

上記の図では抽出条件を同じ行に記載しているのでAnd条件になっていることが分かります。
先ほどと同様に、ビルダーで抽出条件を以下のように設定します。


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

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

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

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

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

検索ボタンの作成

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

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

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

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

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

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

一方で、この状態で直接、フォームのレコードソースになっている売上検索クエリを開くと、条件に合致したレコードが複数表示されます。

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

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

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

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

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

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


 DoCmd.Requery
 

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

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

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

このように、クエリだけで検索フォームを作成するができました。

クエリだけの検索フォームではできないこと

VBAを使わずにクエリだけで検索フォームを作れるのは、便利で簡単です。
一方で、クエリだけの検索フォームではできないこともあります。

レコードを全件表示できない

クエリだけで作成した検索フォームでは、抽出条件が設定されたクエリを基にレコードを表示します。
そのため、抽出条件を適用せずにレコード全件を表示することができません。

特にフォームを開いた最初の状態ではレコードが0件となってしまいます。

特定の抽出条件を無視できない

クエリだけで作成した検索フォームでは特定の抽出条件を無視できません。
例えば今回作成したフォームで売上日の条件を入力しないと、表示されるレコードが常に0件になります。

これは期間の抽出条件が空白でも適用されてしまい、該当するレコードが無いためです。

こうした事象を回避する抽出条件を記載することも可能ですが、クエリで作っていくとどんどん複雑になってしまいます。

複雑な抽出条件の設定が難しい

クエリではAnd条件は同じ行に、Or条件は別の行に設定していきます。
今回は売上日と顧客名という2つの抽出条件のみで、更にAnd条件だという比較的単純な検索条件設定にしていますが、これを売上日だけでも抽出できるようにする、顧客名だけでも抽出できるようにする、売上日はFromとToの片方だけでも抽出できるようにする、と条件を増やしていくとクエリの抽出条件がどんどん複雑化します。

上記のようにクエリを使った検索フォームは、簡単なフォームは作成できますが複雑なものとなるとどんどん難しくなります。
はじめはクエリで検索フォームを作成し、物足りなくなったらVBAでの検索フォームに挑戦するのがよいでしょう。

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

ACCESS 検索フォーム作成方法

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

この記事の内容を実際に試したい方へ

本記事の内容を実際にACCESSを動かしながら確認したいという方向けに、記事で紹介した機能が実装されたサンプルファイルを販売しています。記事内で解説しているテーブル、クエリ、フォーム、レポート、VBAのプロシージャなどをそのまま動く形で実装しました。

学習用としてはもちろん、加工して自社業務に利用することも可能です。
ご興味のある方は以下からご覧ください。

VBAを使わずクエリだけで作った検索フォーム

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

そんな時は、ACCESS開発歴20年以上、過去に300以上のACCESSデータベースの開発・修正実績のあるはこにわガジェット(@hakoniwagadget)にお任せください。

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

フッターバナー

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

ブログサムネイル_クエリだけで検索フォームを作る方法

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次