Microsoft Access 掲示板

フィルターの式が正しく書けない / 3

14 コメント
views
4 フォロー
3

では、とりあえず以下のように修正してみて下さい。

Private Sub btn_検索_Click()

    Dim StartDueDate As String
    Dim EndDueDate As String

    StartDueDate = Trim(Nz([txb_納期検索1], ""))
    StartDueDate = Replace(StartDueDate, "'", "''", 1, -1, vbBinaryCompare)
    
    EndDueDate = Trim(Nz([txb_納期検索2], ""))
    EndDueDate = Replace(EndDueDate, "'", "''", 1, -1, vbBinaryCompare)

    Me.Refresh

    If StartDueDate <> "" And EndDueDate <> "" Then
        Me.Filter = "([納期] between '" & StartDueDate & "' and '" & EndDueDate & "')"
    ElseIf StartDueDate <> "" And EndDueDate = "" Then
        Me.Filter = "([納期] >= '" & StartDueDate & "')"
        
    ElseIf StartDueDate = "" And EndDueDate <> "" Then
        Me.Filter = "([納期] <= '" & EndDueDate & "')"
    Else
        Exit Sub
    End If
        
    Me.FilterOn = True
    btn_解除.SetFocus
        
End Sub
通報 ...
  • 7
    驚天動地!前任者失踪丸 2024/03/11 (月) 11:21:41 23e8e@44ebd >> 3

    skさん、回答ありがとうございます。
    思う通りに動作するようになりました。

    StartDueDate = Replace(StartDueDate, "'", "''", 1, -1, vbBinaryCompare)
    
    EndDueDate = Replace(EndDueDate, "'", "''", 1, -1, vbBinaryCompare)
    

    これはどのような操作なのでしょうか?

  • 8

    それぞれの非連結テキストボックスの値の中に含まれている
    シングルクォーテーション( ' )を Replace 関数によって
    '' に置換し、更に囲み記号としての ' で囲って 1 つの
    文字列リテラルとして解釈されるようにしています。

    前述の例ではフィルター条件式における文字列リテラルの囲み記号として
    シングルクォーテーションを用いていますが、その場合において
    「文字列としてのシングルクォーテーション」を文字列リテラルに含めるには
    '' のように 2 つ続けて記述しなければなりません。

    Dim strFilter As String
    
    strFilter = "[テキスト型のフィールド名] = 'I''m your father.'"
    
    Me.Filter = strFilter
    Me.FilterOn = True
    

    それぞれの非連結テキストボックスにシングルクォーテーションを含む文字列が
    入力された場合、上記のようにエスケープ処理をしておかないと
    「文字列としての ' 」ではなく「文字列リテラルの囲み記号の ' 」として
    解釈されてしまい、構文エラーが発生する可能性が高くなります。

  • 11
    驚天動地!前任者失踪丸 2024/03/11 (月) 15:44:15 23e8e@44ebd >> 3

    なるほど、想定していない(この場合だと6桁以外の数字)入力内容だった場合にエラーを回避するための処理ということですね。勉強になります。