2020-02-05

クエリ実行時のパラメータで複数データをIn演算子で指定する方法

Accessのクエリ実行時、フォーム上で指定した複数のデータを元に、関連するデータをまとめて取得・表示したいといったことがあります。

そういう場合、通常はクエリのINを使ってデータを抽出しますが、VBAでSQL文を毎回手動で生成するなら簡単でも、コントロールの「値集合ソース」に埋め込んだクエリでこれをやろうとすると、やり方が特殊で慣れていないと結構苦労します。

目次

  • やりたいこと
  • クエリ、コード
  • 実行結果
  • 参考リンク

やりたいこと

今回やりたいことは、サンプルで示すと、リストボックスのカテゴリを選択(複数可)したら、それに紐づく商品が別のリストボックスに表示される、というものです。

画面中ほどにあるテキストボックスには商品カテゴリで選択したコードをカンマ区切りの文字列で格納します。このテキストボックスの内容(カンマ区切りのコード)を元に商品一覧のデータを取得・表示します。

クエリ、コード

上記のやりたいことを実現するために、まず、商品一覧の値集合タイプに「テーブル/クエリ」をセットし、値集合ソースのクエリを以下のようにします。

ポイントは「Eval~」と記述している箇所です。


Eval("'" & [商品カテゴリ] & "'" & " In ('" & Replace([Forms]![サンプルフォーム2]![txt選択済み商品カテゴリ],",","','") & "')")

Eval()は指定した条件に合致する場合、True(VBAでは-1)が返ってくるので、上記のEval()の戻り値と抽出条件で指定した「-1」で該当するデータかどうか判定しています。

今回は検索対象のフィールドが文字列(3桁のコード)なため、シングルクォートやReplaceを使っていますが、検索対象のフィールドが数値の場合は不要なので、もう少し見やすくなると思います。

クエリをセットしたら、後は選択したカテゴリのコードをカンマ区切りの文字列にして、商品一覧リストボックスの内容を再取得する処理をVBAに追加します。


Private Sub lst商品カテゴリ選択_Click()
    Dim selectedCategories As String
    selectedCategories = ""

    For Each i In lst商品カテゴリ選択.ItemsSelected
        If selectedCategories <> "" Then
            selectedCategories = selectedCategories & ","
        End If
        selectedCategories = selectedCategories & lst商品カテゴリ選択.Column(0, i)
    Next
    
    txt選択済み商品カテゴリ = selectedCategories
    lst商品.Requery
End Sub

設定は以上です。

実行結果

実際に実行してみると、正常に動作していることが分かります。

Eval()は便利ですが、ダブルクォートやシングルクォートを多用し、コントロールにクエリとして埋め込む場合は書き方が特殊なので、複雑なもので使用すると結構ハマったりします。

参考リンク

Access】関連記事