ACCESS 検索フォームの抽出条件にコンボボックスを利用する方法(VBAコード公開)
ACCESSでよく利用するフォームの一つが検索フォームです。
複数のレコードの中から条件に合ったものを表示できます。
この抽出条件の指定にコンボボックス(プルダウン)を使用することが可能です。
今回は、検索フォームの抽出条件にコンボボックスを利用する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。
完成形
最初に完成形をご提示します。
以下のフォームは、商品一覧を特定の条件で検索するためのフォームです。
検索条件に商品区分検索があり、ここでコンボボックスを利用して下に表示される商品を抽出することが可能です。
以下でこのフォームの作成方法をご紹介します。
検索フォームの作成方法
まず、そもそも検索フォーム自体の作り方がわからないという方は以下の記事をご覧ください。
上の記事がVBAを利用した上級者用の検索フォーム、下の記事がクエリだけで作成する比較的簡単な検索フォームの作成方法です。
こちらがクエリのみでの作成方法です。
これで検索フォームまでは作成した上で、抽出条件にコンボボックスを利用する方法を見ていきましょう。
フォームへのコンボボックス配置
それでは、作成した検索フォームに抽出条件を指定するためのコンボボックスを設置しましょう。
まずはフォームをデザインビューで作成します。
デザインビューでは下記のように設定します。
フォームのヘッダー部分に検索用のコンボボックスを作成します。
コンボボックスは、上段のACCESSメニューから「フォームデザイン」を選択した中にあるアイコンで作成可能です。
なお、検索条件として利用するコンボボックスは非連結にしましょう。
非連結とは、値をフォームで入力してもテーブルに反映されないことを言います。
今回は抽出条件として利用するだけですので、値をテーブルに保存する必要が無いのため、非連結にしています。
コンボボックスを選択してプロパティシートを開き、データタブのコントロールソースが空白になっていれば非連結になります。
また、コンボボックスの名称は検索機能を実装する際に利用するため、「コンボボックス1」などの既定の名称ではなくわかりやすい名称に変更しましょう。
こうしたわかりやすい命名が、のちのエラーや不具合の防止につながります。
コンボボックスの設定
コンボボックスが設置できたら、設定をしてコンボボックスを利用可能にします。
今回作成したコンボボックスには、以下のSORT_商品区分というクエリの2列目「商品区分名」を表示するようにします。
この場合の設定方法を見てみましょう。
フォームのデザインビューでコンボボックス「商品区分検索」のデータタブにある「値集合ソース」を見ます。
ここに利用したいクエリを設定します。
今回は「SORT_商品区分」ですね。
これで、指定したクエリを基にコンボボックスが表示されるようになります。
では一度、フォームビューに戻して動作を確認してみましょう。
あれ?
コンボボックスの表示が数字になってしまっていますね。
本来はこのクエリの2列目にある商品区分名を表示したいのですが、異なるものが表示されてしまっています。
これは、コンボボックスに表示する列の設定が正しくできいないことが原因です。
再度、デザインビューに戻りましょう。
商品区分検索コンボボックスの「書式」タブを見てください。
列数が1になっていますね。
これは、コントロールソースに指定したクエリの1列目、今回でいえば商品区分IDのみを表示する、という設定になっているということです。
2列目の商品区分名までを表示したいので、ここを2に変更しましょう。
こうすることでクエリの2列目までがコンボボックスに表示されます。
さらにその下の列幅は、各列の幅を設定する項目になっています。
列ごとの幅を,(カンマ)で区切って指定することが可能です。
今回はクエリ1列目の商品区分IDは表示せず、商品区分名のみを表示したいため、上記のように0cm,3cmと設定します。
するとこのようにコンボボックスが想定通りに表示されます。
コンボボックスの値を取得して検索する
コンボボックスの設定ができたら、コンボボックスの値を取得して検索ができるように検索プロシージャを設定しましょう。
今回は、コンボボックスで指定の値を選択した後に、「検索」ボタンを押すことでレコードが抽出されるように設定します。
フォームをデザインビューで開き、検索ボタンのプロパティシートで「クリック時イベント」にイベントプロシージャを設定します。
設定するイベントプロシージャの内容は以下の通りです。
Private Sub 検索_ボタン_Click()
Dim filter_txt As String
filter_txt = ""
'商品区分
If Me!商品区分検索 <> "" Then
filter_txt = "商品区分ID = '" & Me!商品区分検索 & "'"
End If
If filter_txt = "" Then
Me.FilterOn = False
Else
Me.Filter = filter_txt
Me.FilterOn = True
Me.OrderBy = "商品ID ASC"
Me.OrderByOn = True
End If
End Sub
プロシージャの内容を解説します。
最初にfilter_txtという文字列型の変数を宣言します。
ここにフォームのレコード抽出に使用する抽出条件式を格納します。
次に、
If Me!商品区分検索 <> "" Then
で商品区分検索コンボボックスに値が指定されているか否かを判定します。
値が入っていた場合は、
filter_txt = "商品区分ID = '" & Me!商品区分検索 & "'"
として、変数filter_txtに商品区分検索の抽出条件を入力します。
Me!商品区分検索がフォームのコンボボックスで指定した値を示しています。
ここでもし、商品区分検索に格納される値が数値型であれば以下の記載で問題ありません。
filter_txt = "商品区分ID = " & Me!商品区分検索
シングルクォーテーションが省かれてシンプルな形になっています。
今回は、商品区分検索に格納される値、つまり商品区分IDが文字列型になっているため、Me!商品区分検索から取得した値の前後にシングルクォーテーションをつけることで文字列として認識させているのです。
最後に
If filter_txt = "" Then
Me.FilterOn = False
で、filter_txtに値が入っている場合はMe.FilterOnをTrueにしてフィルターを適用します。
これで検索機能が完成しました。
以上、検索フォームの抽出条件にコンボボックスを利用する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。