Microsoft Access 掲示板

「、」「。」区切りで複数のキーワードをor検索 and検索

7 コメント
views
4 フォロー

お世話になります。AccsessVBA学習1ヶ月ほどの者です。

参考サイトなどをみて、検索フォームを作りましたが、
2つのテキストボックスで、
(1)複数のキーワードを全角の「、」区切りで
あいまい(or検索)
例:氏名)田中、鈴木 →氏名で田中 または 鈴木が含まれるレコードが検索される

(2)複数のキーワードを全角の「。」区切りで
完全一致(and検索)
例:所属)本社。営業 →所属で本社 と 営業が含まれるレコードが検索される

ができましたが、下記の点が可能かどうか質問します。
お知恵をお借りできればありがたいです。

<質問>
1つのテキストボックスで、
「、」区切りで(or検索)、「。」区切りで(and検索)
のように、2つの条件を切り替えるような事は
可能でしょうか?

条件指定3で実現するには
どのようなコードがありますでしょうか?

入力テキスト:Me.txtWord3
検索対象フィールド:職名
例1:職名)チーフ、リーダー →職名でチーフ または リーダー が含まれるレコードが検索される
例2:職名)チーフ。リーダー →職名でチーフ と リーダー が含まれるレコードが検索される

>>>>>>>>>>>>>>>>>>>>>>
'サンプルコード
Private Sub btnSubmit_Click()

    Dim strFilter As String

    '条件指定1_複数キーワード入力_読点[、]区切りであいまいor検索
    If Not IsNull(Me.txtWord) Then
        strFilter = strFilter & " AND " & BuildCriteria("[氏名]&[フリガナ]", dbText,

        "" & Replace(StrConv(Me.txtWord, vbWide), "、", " OR ") & "")
    End If

    '条件指定2_複数キーワード入力_読点[。]区切りで 完全一致(and検索)
    If Not IsNull(Me.txtWord2) Then
        strFilter = strFilter & " AND " & BuildCriteria("[所属]&[所属_cd]", dbText, _
        "" & Replace(StrConv(Me.txtWord2, vbWide), "。", " AND ") & "")
    End If

    '条件指定3_複数キーワード入力_読点[、]区切りであいまいor検索 読点[。]区切りで 完全一致(and検索)
    If Not IsNull(Me.txtWord3) Then
        strFilter = strFilter & " AND " & BuildCriteria("職名", dbText,

        "" & Replace(StrConv(Me.txtWord3, vbWide), "、", " OR ") & "")
    End If

    '先頭の" AND "を取り除く
    strFilter = Mid(strFilter, 6)

    'フィルター条件の設定
    Me.Filter = strFilter
    'フィルターの実行 (もしくは解除)
    Me.FilterOn = (strFilter <> "")

    'フィルター条件空の場合のメッセージ
    If Me.FilterOn = False Then
    MsgBox "検索条件を入れてください"
    End If

    'フィルター条件空の場合のメッセージ
    If (Me.Recordset.RecordCount = 0) Then
    MsgBox "該当データはありません"
    Cancel = True
    End If

End Sub

keepit
作成: 2020/09/15 (火) 12:40:54
最終更新: 2020/09/15 (火) 12:51:05
通報 ...
1
hiroton 2020/09/15 (火) 14:36:13 49c70@f966d

1つのテキストボックスで、
「、」区切りで(or検索)、「。」区切りで(and検索)
のように、2つの条件を切り替えるような事は
可能でしょうか?

テキストの中に「、」「。」が含まれているかどうかチェックすれば条件分岐はできます

Dim matchOr as boolean
Dim matchAnd as boolean

matchOr = InStr("、", Me!txtWord) > 0
matchAnd = InStr("。", Me!txtWord) > 0

If matchOr And matchAnd Then
'「、」「。」両方含むとき'
ElseIf matchOr And Not matchAnd Then
'「、」だけ両方含むとき'
ElseIf Not matchOr AND matchAnd Then
'「。」だけ両方含むとき'
Else
'「、」「。」どちらも含まないとき'
End If

条件指定3で実現するには
どのようなコードがありますでしょうか?

BuildCriteriaを2回重ねることはできないので、どちらかの条件部分を自前で実装ですね。ただ、配列にして処理してしまえば出来上がった条件をつなげるだけなのであっさりできます

Const OrSeparator = "、"
Const AndSeparator = "。"

Dim filterWords
Dim n As Long

If Me!txtWord3 <> "" Then
    filterWords = Split(Me!txtWord3, OrSeparator)
    For n = 0 To UBound(filterWords)
        filterWords(n) = BuildCriteria("[職名]", dbText, _
        "" & Replace(StrConv(filterWords(n), vbWide), AndSeparator, " AND 
") & "")
    Next

    strFilter = strFilter & " AND " & Join(filterWords, " OR ")
End If
3

部分一致が考慮されていないですね。
あと、AND と OR の演算優先順位を考慮する必要もあります。

6

hiroton 様
迅速な回答いただき誠にありがとうございます。

hatena 様が教え得て頂いた>レス4で実装できました。
BuildCriteriaを2回重ねる事は出来ないのですね。
配列にして処理すること、加えて勉強させて頂きます。

7
hiroton 2020/09/16 (水) 12:08:15 39c44@f966d >> 3

BuildCriteriaは引数に決まった書式の文字列を要求するので1度通すと書式が不適切になってしまいます
あとは、例えば、「チーフ、、リーダー」のような誤入力(「、」が2回連続している)なんかも決まった書式を満たせずエラーになるので注意が必要ですね

文字列を区切り文字でsplitして配列に~な処理は今回はあまり適していない(hatenaさんの回答のほうが適切)なので、そういう関数もあるなぁくらいで大丈夫です

2

可能ですが、下記の点について補足をお願いします。

'条件指定3_複数キーワード入力_読点[、]区切りであいまいor検索 読点[。]区切りで 完全一致(and検索)

の部分ですが、
読点[、]区切りであいまいor検索は、
あいまい(=部分一致) で or条件、つまり、複数のキーワードのうち一つでも含まれれば抽出する、
ということでよね。

読点[。]区切りで 完全一致(and検索) は(読点は句点の間違いとして)、
完全一致でand条件ということはありえないので、部分一致 で and条件ということですよね。
つまり、複数のキーワードをすべて含むデータを抽出する。

あと、読点 と 句点 が混在する可能性はありますか。
「チーフ。リーダー、ボス」とか。

4
hatena 2020/09/15 (火) 15:14:57 修正 >> 2

いちおう、たたき台として、

Private Sub btnSubmit_Click()

    Dim strFilter As String
 
    '中略
  
    '条件指定3_複数キーワード入力
    '読点[、]区切りで部分一致でor条件 句点[。]区切りで部分一致でand条件)
    If Me.txtWord3 <> "" Then
       Dim strSubFilter As String
       strSubFilter = Me.txtWord3
       strSubFilter = "*" & Replace(strSubFilter, "。", "* And *") & "*"        
       strSubFilter = Replace(strSubFilter, "、", "* Or *")
       strSubFilter = "(" & BuildCriteria("職名", dbText, strSubFilter) & ")"

       strFilter = strFilter & " AND " & strSubFilter
    End If

    '後略

End Sub

読点(、)、句点(。)混在は可能ですが、And演算子がOr演算子より演算順位が高いので、
ユーザーがそれを理解していないと期待の結果にならない場合があるので注意が必要。

上記の strSubFilter には、下記のような条件式が格納されます。

Me.txtWord3 => strSubFilter

チーフ。リーダー => (職名 Like "*チーフ*" And 職名 Like "*リーダー*")

チーフ、リーダー => (職名 Like "*チーフ*" Or 職名 Like "*リーダー*")

チーフ。リーダー、ボス => (職名 Like "*チーフ*" And 職名 Like "*リーダー*" Or 職名 Like "*ボス*")

5

hatena 様
迅速な回答いただき誠にありがとうございます。

句点、部分一致の文中の間違いご指摘ありがとうございます。

>あと、読点 と 句点 が混在する可能性はありますか。
>「チーフ。リーダー、ボス」とか。
読点 と 句点 が混在する可能性はありません。
どちらかでしか検索出来ないようにしたいとおもっています。

たたき台を使用させて頂きましたところ、
思っていたように検索が出来ました。
本当にありがとうございます。
教えて頂いたこと、勉強させて頂きます。