Microsoft Access 掲示板

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

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

まずフィールド[納期]のデータ型を明記されることをお奨めします。

通報 ...
  • 2
    驚天動地!前任者失踪丸 2024/03/11 (月) 10:47:01 23e8e@44ebd >> 1

    納期のデータ型は短いテキスト型です。

    5
    驚天動地!前任者失踪丸 2024/03/11 (月) 11:04:42 23e8e@44ebd >> 2

    客先から受け取るCSVデータをインポートすると短いテキスト型になっており、値も"240311”の6桁です。

    6
    驚天動地!前任者失踪丸 2024/03/11 (月) 11:18:33 23e8e@44ebd >> 2

    リアクションでは何を伝えたいのか分かりませんので文章にしていただきますようよろしくお願い致します。

    9

    反応がないようなので、管理者権限で削除しておきました。

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

    Hatenaさん、お手数をおかけしてしまい申し訳ありません。
    ありがとうございます。

  • 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桁以外の数字)入力内容だった場合にエラーを回避するための処理ということですね。勉強になります。