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
同じ製品を違う顧客へ販売する場合もあるので、
顧客×製品で検索したいのですが、どのように修正したらいいでしょうか?
複数選択可能なリストボックスを使ったうんぬんってそれなりに高度な内容(だと思っている)ので本題との難易度の差がどこで躓いているのかよくわからんです
Filter プロパティ (Access)
FilterにはWHERE句と同等の文字列を設定する(てきとー)なので
のようになるよう
strFilter
を作ってあげれば良いです下記のような仕様だと仮定した場合のコード例
顧客を選択するコンボボックス
名前 cb顧客
連結しているフィールド 顧客ID(数値型)
hatenaさんありがとうございます!
早速試したのですが、
strFilter = "顧客ID=" & Me!cb顧客 & " AND " strFilter
ここで「構文エラー」になってしまいます・・・泣
あっ、すみません。間違てますね。下記に修正してください。
strFilter = "顧客ID=" & Me!cb顧客 & " AND " & strFilter
元の回答も修正しておきます。
hatenaさんありがとうございます。
が、しかし、エラーは出なくなったのですが、
フィルタ適用ボタンを押してもサブフォームになにも出てこなくなってしまいました 泣
(フォームを開いたときはすべてのデータが表示されるのですが、
その後顧客IDを選んで、製品コードを選んで、「フィルタ適用」を押すとなにも表示されなくなってしまいます。)
では、まず、私の回答のコードを参考にして、実際に書いたコードを提示してください。
あと、顧客ID と 製品コード のデータ型も教えてください。(数値型か、テキスト型か)
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‘‘‘
コードに下記のようにデバッグ用のコードを埋め込んでください。
その後、フォームを開いて、リストボックスでリストを複数選択して、フィルタ適用ボタンをクリックします。
次に、Ctrl+G でイミディエイトウィンドウを開いて、そこに出力されているテキストをコピーしてここに貼り付けてもらえますか。
貼り付けます。
選択数: 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')
これで
Itm
に入るのはリストのインデックスになってますね。ItemsSelected プロパティ (Access)(インデックスを入れる変数名にItmを使うのはなんかやだなぁと思ったけどリンク先の例文も
varItm
だった・・・)あと
VBEのオプション設定のお勧めを徹底解説
VBA触るなら読まないと損するページです。
つまらないミスをなくすためにも変数宣言の強制を。
hirotonさん、サポートありがとうございます。
ItemsSelected はインデックスが入るのでした。あと、コピペミスもしてました。
うしねこさん、hirotonさんの回答を参考に修正してください。
hirotonさん
hatenaさん
理想どおりに動きました!!
まだよく理解できていない部分も多いので、
リンク先をよく見て勉強します。
本当にありがとうございました。