この度は大変お世話になります。Accsessを使い初めて1ヶ月ほどの初心者です。
「複数条件の抽出フォームの設計その1」サイトを参考にさせていただき、検索フォームを作っております。
テキストボックス「総合検索」で複数フィールドを対象に、オプションボタンでor/and切替を設定し、他のフィールド対象のテキストボックスと連動した検索フォームとなります。
下記のサンプルコードの検索結果で、「総合検索の or で複数キーワード入力」+「その他のテキストボックスにキーワード入力」の上で検索を実行すると、「総合検索の or で複数キーワードを入力」した結果のみ表示されて、その他のテキストボックスにキーワード入力」した条件が動作しません。
なお、以下の場合は問題なく動作することを確認しております。
1.「総合検索の and で複数キーワード入力」+「その他のテキストボックスにキーワード入力」の上で検索を実行した場合
2.「総合検索の or で1つのキーワード入力」+「その他のテキストボックスにキーワード入力」の上で検索を実行
3.「総合検索の or で複数キーワード入力」のみで検索実行
4.「総合検索にキーワード未入力」で、「その他の各テキストボックスにキーワード入力」の上で検索を実行
<質問>
「or」を選択 / 複数キーワード入力 / 他の何れかテキストボックスにキーワード入力 した場合の検索結果のみ不具合となり、「総合検索」 or / 複数キーワード入力の検索しか動作していないような状態となります。
コードに不具合があるのか、orで連動させる場合には追加のコードが必要になるのか等、ご教示くださいますようお願いいたします。
(フィールド名) (データ型) (抽出仕様)の順
・項番 テキスト型 部分一致
・名前 テキスト型 部分一致
・コード 数値型 部分一致
・種別 テキスト型 部分一致
・質問 メモ型
・回答 メモ型
(テキストボックス「総合検索」で、「質問」「回答」「種別」の複数キーワード検索をオプションボタン[fra_kensaku]で「or(1)」「and(2)」検索条件を切り替え
・対応開始日 日付/時刻型
(コンボボックス[cmb_対象]で種別「対応開始日/対応完了日」を選択し、テキストボックスで範囲指定)
・対応完了日 日付/時刻型
(コンボボックス[cmb_対象]で種別「対応開始日/対応完了日」を選択し、テキストボックスで範囲指定)
>>>>>>>>>>>>>>>>>>>>>>
サンプルコード
>>>>>>>>>>>>>>>>>>>>>>
Private Sub btnクリア_Click()
Me!txt項番 = ""
Me! cmb_対象 = ""
Me! min開始日 = ""
Me! max完了日 = ""
Me! cmb_名前 = ""
Me! txtコード = ""
Me! cmb_種別 = ""
Me!総合検索 = ""
End Sub
Private Sub cmdFilter_Click()
Dim str Filter As String, strExp As String aryOpe
If Not IsNull(Me.txt_項番) Then
strFilter= strFilter & " AND 項番 Like'" & Me.txt_項番 & "'"
End If
If Not IsNull(Me.cmb_名前) Then
strFilter= strFilter & " AND 名前 Like'" & Me.cmb_名前 & "'"
End If
If Not IsNull(Me.txtコード) Then
strFilter= strFilter & " AND コード Like'" & Me.txtコード & "'"
End If
If Not IsNull(Me.cmb_種別) Then
strFilter= strFilter & " AND 種別 Like'" & Me.cmb_種別 & "'"
End If
Select Case frakensaku
Case 1
If Not IsNull(Me.総合検索) Then
strFilter = strFilter & " and " & BuildCriteria("[質問]&[回答]&[種別]" , dbtext,
"*" & Replace (StrConv(Me.総合検索, vbwide), " ", "* OR *") & "*")
End If
Case 2
If Not IsNull(Me.総合検索) Then
strFilter = strFilter & " and " & BuildCriteria("[質問]&[回答]&[種別]" , dbtext, _
"*" & Replace (StrConv(Me.総合検索, vbwide), " ", "* AND *") & "*")
End If
End Select
Select Case me.cmb_対象
Case "対応開始日"
If Not IsNull(Me.min開始日) Then
strFilter = strFilter & " AND 対応開始日 >= #" & Nz (Me.min開始日) & "#"
End If
If Not IsNull(Me.max完了日) Then
strFilter = strFilter & " AND 対応開始日 >= #" & Nz (Me.max完了日) & "#"
End If
Case "対応完了日"
If Not IsNull(Me.min開始日) Then
strFilter = strFilter & " AND 対応完了日 >= #" & Nz (Me.min開始日) & "#"
End If
If Not IsNull(Me.max完了日) Then
strFilter = strFilter & " AND 対応完了日 >= #" & Nz (Me.max完了日) & "#"
End If
End Select
Me.Filter = Mid(strFilter, 6)
If strFilter = "" Then
Me.FilterOn = False
Else
Me.FilterOn = True
End If
End Sub
Private Sub クリア_click()
Me!txt項番 = Null
Me!cmb_対象 = Null
Me!min開始日 = Null
Me!max完了日 = Null
Me!cmb_名前 = Null
Me!txtコード = Null
Me!cmb_種別 = Null
Me!総合検索 = Null
End Sub
Private Sub Form_ Open(Cancel As Integer)
DoCmd.ShowToolbar "Ribbon ", acToolbarNo
End Sub
コードはコピペしましょう。また、コードブロックを使うと読みやすくなります
フィルタのAND/ORには優先順位があります。次の二つでは結果が変わります
不具合の時の
StrFilter
の内容をみて条件式が間違ってないか確認してみてください早速のご教示をいただきましてありがとうございました。
私ではコードの修正が難しかったため、詳しい方にもご協力いただきまして、
「or」対象の「Case 1」のコードを以下で確認してみたいと思います
。もし、お気づきの点などございましたらご指摘いただけましたら幸いです。
修正後のコードが実際のコード(実際に動かしたコードをコピペしたもの)であるならうまく動いてないんじゃないですか?
抽出条件に使うワイルドカードは半角の記号である必要があります。以下に変数部分を適当に置き換えてイミディエイトウィンドウでテストした結果を提示します
本当に全角の「*」で挟んだ形で完全一致判定をしたいのであれば提示のコードですが多分そうじゃないですよね?
hiroton 様
ご教示いただきまして誠にありがとうございます。
ご指摘いただきました「*」を半角にした上で、それ以外の細かい修正も行い以下コードで期待する動作ができるようになりました。お陰さまで本当に助かりました。これからも、今回教えていただきました内容を踏まえまして引き続き勉強させていただきます。