Microsoft Access 掲示板

コンボボックスとリストボックスの併用検索

12 コメント
views
4 フォロー

Accessで販売実績のデータベースを作成してます。
フォームのコンボボックスで顧客名を選ぶと、
その顧客へ販売している製品がリストボックスに表示され、
リストボックスから製品を選択(複数の場合もあり)して、
「検索」ボタンを押すとクエリからデータを検索し、サブフォームに該当のデータが出るようにしたいです。

下記のサイトを拝見し、
書いてあったコードを自分なりに修正したところ、無事動いたのですが、
製品だけの検索になってしまいます。

http://www.accessclub.jp/bbs/0015/beginers6827.html

Private Sub フィルタ適用ボタン_Click()

'----( 変数宣言 )-------------------------------------------------
Dim strFilter As String 'フィルタ文字列
Dim lngX1 As Long 'リストボックスの行カウンタ

'-----( リストボックスの複数選択行を取得 )------------------------
strFilter = ""
For lngX1 = 0 To Me![リスト].ListCount - 1
If Me![リスト].Selected(lngX1) Then
If strFilter = "" Then
strFilter = "製品コード IN ('" & Me![リスト].Column(0, lngX1) & "'"
Else
strFilter = strFilter & ",'" & Me![リスト].Column(0, lngX1) & "'"
End If
End If
Next

'----( フィルタ適用 )---------------------------------------------
If strFilter <> "" Then
strFilter = strFilter & ")"
Me![販売実績サブ].Form.Filter = strFilter
Me![販売実績サブ].Form.FilterOn = True
End If

End Sub

同じ製品を違う顧客へ販売する場合もあるので、
顧客×製品で検索したいのですが、どのように修正したらいいでしょうか?

うしねこ
作成: 2020/04/07 (火) 17:06:17
通報 ...
1
hiroton 2020/04/08 (水) 10:26:18 65ab2@f966d

複数選択可能なリストボックスを使ったうんぬんってそれなりに高度な内容(だと思っている)ので本題との難易度の差がどこで躓いているのかよくわからんです

Filter プロパティ (Access)

FilterにはWHERE句と同等の文字列を設定する(てきとー)なので

Me![販売実績サブ].Form.Filter = "顧客ID=1 AND 製品コード IN('a','b')"

のようになるようstrFilterを作ってあげれば良いです

2
hatena 2020/04/08 (水) 17:28:58 修正

下記のような仕様だと仮定した場合のコード例

顧客を選択するコンボボックス
名前 cb顧客
連結しているフィールド 顧客ID(数値型)

Private Sub フィルタ適用ボタン_Click()
    Dim strFilter As String 'フィルタ文字列

    '製品用フィルター生成
    Dim Itm As Variant
    For Each Itm In Me![リスト].ItemsSelected
        strFilter = strFilter & ",'" & Itm & "'"
    Next
    If strFilter = "" Then
        MsgBox "製品をリストから選択してください。"
        Exit Sub
    End If
    strFilter = "製品コード In (" & Mid(strFilter, 2) & ")"
    
    '顧客用フィルター追加
    If Me!cb顧客 <> "" Then
        strFilter = "顧客ID=" & Me!cb顧客 & " AND " & strFilter
    End If
    
    If strFilter <> "" Then
        Me![販売実績サブ].Form.Filter = strFilter
        Me![販売実績サブ].Form.FilterOn = True
    End If

End Sub
3
うしねこ 2020/04/10 (金) 17:16:07

hatenaさんありがとうございます!

早速試したのですが、
strFilter = "顧客ID=" & Me!cb顧客 & " AND " strFilter
ここで「構文エラー」になってしまいます・・・泣

4
hatena 2020/04/10 (金) 22:51:54 修正 >> 3

あっ、すみません。間違てますね。下記に修正してください。

strFilter = "顧客ID=" & Me!cb顧客 & " AND " & strFilter

元の回答も修正しておきます。

5
うしねこ 2020/04/13 (月) 11:04:00

hatenaさんありがとうございます。

が、しかし、エラーは出なくなったのですが、
フィルタ適用ボタンを押してもサブフォームになにも出てこなくなってしまいました 泣
(フォームを開いたときはすべてのデータが表示されるのですが、
その後顧客IDを選んで、製品コードを選んで、「フィルタ適用」を押すとなにも表示されなくなってしまいます。)

6
hatena 2020/04/13 (月) 14:57:02 修正

では、まず、私の回答のコードを参考にして、実際に書いたコードを提示してください。

あと、顧客ID と 製品コード のデータ型も教えてください。(数値型か、テキスト型か)

7
うしねこ 2020/04/14 (火) 09:36:18

hatenaさんありがとうございます。

顧客ID:数値型
製品コード:テキスト型

コード提示いたします。

デバッグをしてみたところ、 Itmがemptyになっていることに気が付きました。
サブフォームになにも表示されなくなってしまう件と
なにか関係がありますでしょうか・・・?

‘‘‘Private Sub フィルタ適用ボタン_Click()

    Dim strFilter As Variant 'フィルタ文字列
    Dim trFilter As Variant

    '製品用フィルター生成
    Dim Itm As Variant

    For Each Itm In Me![製品リストbox].ItemsSelected
        strFilter = strFilter & ",'" & Itm & "'"
    Next
    If strFilter = "" Then
        MsgBox "製品をリストから選択してください。"

        Exit Sub

    End If

    strFilter = "製品コード In (" & Mid(strFilter, 2) & ")"

    '顧客用フィルター追加
    If Me!コンボID <> "" Then
            trFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter
    End If

    If strFilter <> "" Then
        Me![販売実績サブ].Form.Filter = strFilter
        Me![販売実績サブ].Form.FilterOn = True
    End If

End Sub‘‘‘

8

コードに下記のようにデバッグ用のコードを埋め込んでください。

その後、フォームを開いて、リストボックスでリストを複数選択して、フィルタ適用ボタンをクリックします。

次に、Ctrl+G でイミディエイトウィンドウを開いて、そこに出力されているテキストをコピーしてここに貼り付けてもらえますか。

Private Sub フィルタ適用ボタン_Click()

    Dim strFilter As String 'フィルタ文字列

    Debug.print "選択数: " & Me![製品リストbox].ItemsSelected.Count '※デバッグコード

    '製品用フィルター生成
    Dim Itm As Variant
    For Each Itm In Me![製品リストbox].ItemsSelected
        strFilter = strFilter & ",'" & Itm & "'"
    Next

    If strFilter = "" Then
        MsgBox "製品をリストから選択してください。"

        Exit Sub
    End If

    strFilter = "製品コード In (" & Mid(strFilter, 2) & ")"

    Debug.print "strFilter: " & strFilter '※デバッグコード

    '顧客用フィルター追加
    If Me!コンボID <> "" Then
            trFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter
    End If

    If strFilter <> "" Then
        Me![販売実績サブ].Form.Filter = strFilter
        Me![販売実績サブ].Form.FilterOn = True
    End If

    Debug.print "Form.Filter: " & Me![販売実績サブ].Form.Filter '※デバッグコード

End Sub
9
うしねこ 2020/04/14 (火) 11:11:04

貼り付けます。

選択数: 4
strFilter: 製品コード In ('0','1','3','5')
Form.Filter: 製品コード In ('0','1','3','5')
選択数: 3
strFilter: 製品コード In ('0','1','3')
Form.Filter: 製品コード In ('0','1','3')
選択数: 3
strFilter: 製品コード In ('0','1','2')
Form.Filter: 製品コード In ('0','1','2')
選択数: 3
strFilter: 製品コード In ('0','1','2')
Form.Filter: 製品コード In ('0','1','2')

10
hiroton 2020/04/14 (火) 13:51:09 修正 fc935@f966d
For Each Itm In Me![製品リストbox].ItemsSelected

これでItmに入るのはリストのインデックスになってますね。ItemsSelected プロパティ (Access)
(インデックスを入れる変数名にItmを使うのはなんかやだなぁと思ったけどリンク先の例文もvarItmだった・・・)

    '製品用フィルター生成
    Dim listIndex As Variant
    For Each listIndex In Me![製品リストbox].ItemsSelected
        strFilter = strFilter & ",'" & Me![製品リストbox].ItemData(listIndex)  & "'"
    Next

あと

    '顧客用フィルター追加
    If Me!コンボID <> "" Then
'           trFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter  ←コピペミス?'
            strFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter
    End If

VBEのオプション設定のお勧めを徹底解説
VBA触るなら読まないと損するページです。
つまらないミスをなくすためにも変数宣言の強制を。

11

hirotonさん、サポートありがとうございます。
ItemsSelected はインデックスが入るのでした。あと、コピペミスもしてました。
うしねこさん、hirotonさんの回答を参考に修正してください。

12
うしねこ 2020/04/15 (水) 23:28:24 482a1@8a5c8

hirotonさん
hatenaさん

理想どおりに動きました!!

まだよく理解できていない部分も多いので、
リンク先をよく見て勉強します。
本当にありがとうございました。