クエリ実行時のパラメータで複数データを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
設定は以上です。