腰を据えてパソコンの前に座る時間が取れずだいぶ遅くなってしまいましたが返答を入れます。
リストボックスについての話はありません。かなり基礎的な内容です。
今回の案件で考えるべきは
- 入力(複数選択が可能なリストボックスの使い方)
- 出力(
Me.Filter
に設定する値) - コードの書き方
と3つあり、それぞれの影響はあまり大きくありません。色々試したということですが質問に記載のコードは前回の質問で完成したままで、試した内容がわかりません。
解決策としてはhatenaさん提示の通りという簡単なものですが、どのようなアプローチで無理な事を考えているに至ったのがわからないので「質問丸投げ、コードコピペ、次への応用ができない」という不安がでます。
この部分の確認が>> 1の質問でした。
ということで、不安になりそうなところを上げておきます。
別々な条件をすべて抽出
何となく理解しているだろうことは見えますが、Or
で抽出できます。例えば1月、2月、3月を抽出したいとなると"月 = 1 Or 月 = 2 Or 月 = 3"
となります。テキストボックスを使って「1 2 3」の入力があるなら
"月 = " & Replace(Me.複数月検索, " ", " Or 月 = ")
なんて形になるでしょう。
ただし、実践上は他の条件との兼ね合いがあるので(And Orの優先順位を考慮すると"And (月 = 1 Or 月 = 2 Or 月 = 3)"
がほしい)
If Not IsNull(Me.複数月検索) Then
strFilter = strFilter & " And (月 = " & Replace(Me.複数月検索, " ", " Or 月 = ") & ")"
End If
>> 2のコードはもう少しというところですね。
(BuildCriteriaを使う方法は不正解ではないですが、今回そこまで難しく考える必要はないので特に補足はしません)
最終的なリストボックスのコードはそれ用に独特の内容もありますが、全体の処理の流れは変わりませんし、出力(strfilterの値)も変わりません。(In句を使うかどうかは別問題です。後述)
最終目標はリストボックスを使ってとなりますが、問題を分割して何がわからないのかをもう少し掘り下げておけるとよかったと思います。
In句について
ここでの使い方は複数のOrをまとめたもの。
つまり「" And (月 = 1 Or 月 = 2 Or 月 = 3)"
」と「" And 月 In (1,2,3)"
」は全く同じ動作をするということになります。
これを表すコード部分で言うと
" AND (月 = " & Replace(Me.複数月検索, " ", " Or 月 = ") & ")"
" AND 月 In (" & Replace(Me.複数月検索, " ", ",") & ")"
はどちらを記述しても全く同じ動作をすることになります。完成形のコードのほうであれば
" AND 月 In (" & Mid(ItmList, 2) & ")"
" AND (月 = " & Replace(Mid(ItmList, 2), ",", " Or 月 = " & ")"
のどちらを書いても同じ結果になります。
In句のほうが読みやすいのが一番のメリットですね。
In句を使っているからと言ってなにも特別なことはないとわかれば>> 4の疑問も理解できると思います。
以上、「全くわからない」を「何がわからないのかわかる」ようにするために問題を切り分けましょうという話でした。