Microsoft Access 掲示板

複数のキーワードでor検索時、その他の検索項目との連動検索

7 コメント
views
4 フォロー

この度は大変お世話になります。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

aomini3298
作成: 2021/07/09 (金) 10:08:29
通報 ...
1
hiroton 2021/07/09 (金) 11:30:18 1392b@f966d

コードはコピペしましょう。また、コードブロックを使うと読みやすくなります


フィルタのAND/ORには優先順位があります。次の二つでは結果が変わります

A and B or C and D
A and ( B or C ) and D

不具合の時のStrFilterの内容をみて条件式が間違ってないか確認してみてください

2
aomini3298 2021/07/11 (日) 09:42:21

早速のご教示をいただきましてありがとうございました。

私ではコードの修正が難しかったため、詳しい方にもご協力いただきまして、
「or」対象の「Case 1」のコードを以下で確認してみたいと思います
。もし、お気づきの点などございましたらご指摘いただけましたら幸いです。

If Not IsNull(Me.総合検索) Then
            strFilter = strFilter & " and " & BuildCriteria("[質問]&[回
答]&[種別]" , dbtext,
            "(*" & Replace (StrConv(Me.総合検索, vbwide), " ", "* OR *") &
"*)")
        End If
3
hiroton 2021/07/12 (月) 16:19:12 c789f@f966d

修正後のコードが実際のコード(実際に動かしたコードをコピペしたもの)であるならうまく動いてないんじゃないですか?

抽出条件に使うワイルドカードは半角の記号である必要があります。以下に変数部分を適当に置き換えてイミディエイトウィンドウでテストした結果を提示します

// *が全角の場合
?BuildCriteria("abc" , dbtext,"(*" & Replace (StrConv("a b c", vbwide), " ", "* OR *") &"*)")
(abc="*a*" Or abc="*b*" Or abc="*c*")

// *が半角の場合
?BuildCriteria("abc" , dbtext,"(*" & Replace (StrConv("a b c", vbwide), " ", "* OR *") &"*)")
(abc Like "*a*" Or abc Like "*b*" Or abc Like "*c*")

本当に全角の「*」で挟んだ形で完全一致判定をしたいのであれば提示のコードですが多分そうじゃないですよね?

7
aomini3298 2021/07/12 (月) 19:27:59

hiroton 様
ご教示いただきまして誠にありがとうございます。

ご指摘いただきました「*」を半角にした上で、それ以外の細かい修正も行い以下コードで期待する動作ができるようになりました。お陰さまで本当に助かりました。これからも、今回教えていただきました内容を踏まえまして引き続き勉強させていただきます。

If Not IsNull(Me.総合検索) Then
    strFilter = strFilter & “ AND “ & BuildCriteria(“[質問]&[回答]&[種別]”, dbText, _
   “(*” & Replace(StrConv(Me.総合検索, vbWide), “ “, “ * OR *") & "*)")
End If