Microsoft Access 掲示板

複数検索項目の中に、複数選択可能なリストボックスを組み込みたい。

7 コメント
views
4 フォロー

お世話になります。
以前にも教えて頂いた複数項目で検索フォームに、項目の追加を考えています。

リストボックス名を月検索(数値型)とし、複数選択が可能なリストボックスで、月を複数選択して、選択した月をすべて抽出したいと、【複数選択リストボックスで選択したレコードの印刷】等々をもとに色々試したのですが、どうすればいいのか、全くわからない状態です。無理な事を考えているのでしょうか?
どうぞよろしくお願いいたします。

フィールド名コンボボックス名データ型・抽出仕様
氏名氏名検索テキスト型 部分一致
フリガナ氏名検索テキスト型 部分一致
参加有無参加Yes/No型 一致
性別性別検索テキスト型 部分一致
就職年月日就職日日付/時刻型 二つのテキストボックスで範囲指定
フィールド名テキストボックス名データ型・抽出仕様
月検索数値型 一致
Private Sub 抽出_Click()
    Dim strfilter As String, strexp As String, aryope As Variant
    
If Not IsNull(Me.氏名検索) Then

strfilter = strfilter & " AND (氏名 Like ""*" & Me.氏名検索 & "*"" Orフリガナ Like ""*" & Me.氏名検索 & "*"")"
End If

If Me.参加 = True Then
strfilter = strfilter & " AND 参加有無 =" & Me.参加
End If
    
If Not IsNull(Me.性別検索) Then
strfilter = strfilter & " AND 性別 Like '*" & Me.性別検索 & "*'"
End If
                
If Not IsNull(Me.min就職日) Then
If Me.min就職日 > Format(Date, "yy/mm") Then
strfilter = strfilter & " AND 就職年月日 >= #" & "19" & Nz(Me.min就職日) & "#"
  Else
    strfilter = strfilter & " AND  就職年月日>= #" & "20" & Nz(Me.min就職日) & "#"
End If
    End If

If Not IsNull(Me.max就職日) Then
If Me.max就職日 > Format(Date, "yy/mm") Then
strfilter = strfilter & " AND 就職年月日 < #" & DateAdd("m", 1, "19" & Me.max就職日) & "#"
Else
strfilter = strfilter & " AND 就職年月日 < #" & DateAdd("m", 1, "20" & Me.max就職日) & "#"
End If
    End If
               
    Me.Filter = Mid(strfilter, 6)
    If strfilter = "" Then
    Me.FilterOn = False
    Else
    Me.FilterOn = True
    End If

End Sub
ただいま勉強中
作成: 2019/09/24 (火) 11:51:22
最終更新: 2019/09/25 (水) 10:52:45
通報 ...
1
hiroton 2019/09/24 (火) 16:31:11 e46aa@f966d

全くわからないと言われてしまうとどうすべきなのか迷いますが・・・

選択した月をすべて抽出したいということですが、複数選択が可能なリストボックスを使わなかったらできますか?
「月」の抽出なので、例えばテキストボックスを12個使ったりとか、チェックボックスを12個使ったりとかです。

まずはここまで

2
ただいま勉強中 2019/09/25 (水) 10:19:14 10d1a@96e2f >> 1

 😄ご回答頂きまして、ありがとうございます。

チェックボックスは試していませんが、
スペースで区切って複数選択!なるものを試してみたのですが・・・・・・下記コードで当然のごとく、文字列として検索してしまい、例えば 1月と4月 を検索すると 入力は 「1 4」 で、検索結果は 1と11と12と4となります。
これを数値で検索できるようにするには・・・・・で、どこを修正すればいいのかわからず、また詰まっています。
すみません。😨

If Not IsNull(Me.複数月検索) Then
    strFilter = strFilter & " AND " & BuildCriteria("月", dbText, "*" & Replace(StrConv(Me.複数月検索, vbWide), " ", "* Or *") & "*")
    End If

テキストボックスは試してみようと思います。

3

リストボックス
名前 月検索
複数選択 標準 または 拡張
値集合タイプ 値リスト
値集合ソース 1;2;3;4;5;6;7;8;9;10;11;12

対象フィールド
フィールド名 月 (数値型)

として、下記のようなコードになります。

    Dim Itm As Variant, ItmList As String
    With Me.月検索
        If .ItemsSelected.Count > 0 Then
            For Each Itm In .ItemsSelected
                ItmList = ItmList & "," & .ItemData(Itm)
            Next
            strfilter = strfilter & " AND 月 In (" & Mid(ItmList, 2) & ")"
        End If
    End With

簡単に解説しておきますと、

リストボックスの ItemsSelectedプロパティには、選択されたアイテムのインデックスが格納されています。
For Each でインデックス(Itm)を一つずつ取り出します。
ItemData(Itm) でインデックスに対応するデータを取り出します。
取り出したデータを カンマ区切りで連結していきます。
最後に、AND 月 In ( ) に挿入して、下記のような条件式文字列にします。

AND 月 In (2,4,6,9,11)

2,4,6,9,11 を選択した場合

4
ただいま勉強中 2019/09/25 (水) 15:32:40 10d1a@96e2f >> 3

 ご回答頂きましてありがとうございます。
思うように動作させることが出来ました。
本当にありがとうございました。

テキスト型にも運用できるようにしていきたいと思い以下のようにコード
を変更してみました。
テキスト型の項目に試してみると、抽出出来たのですが、
この部分だけの変更でいいのか、よく理解できていません。😨

ItmList = ItmList & ",’" & .ItemData(Itm) & “’”
5

はい、それで大丈夫ですよ(^-^)。😊

6
ただいま勉強中 2019/09/25 (水) 17:35:30 10d1a@96e2f >> 4

😆
ほっと安心できました。
ありがとうございました。

7
hiroton 2019/09/28 (土) 16:05:49 5a376@f966d

腰を据えてパソコンの前に座る時間が取れずだいぶ遅くなってしまいましたが返答を入れます。
リストボックスについての話はありません。かなり基礎的な内容です。

今回の案件で考えるべきは

  1. 入力(複数選択が可能なリストボックスの使い方)
  2. 出力(Me.Filterに設定する値)
  3. コードの書き方

と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の疑問も理解できると思います。


以上、「全くわからない」を「何がわからないのかわかる」ようにするために問題を切り分けましょうという話でした。