- 締切済み
Access2007 DoCmd.ApplyFilterのAnd条件について
お世話になっております。 下記のフィルタはそれぞれ単独で機能しています。 DoCmd.ApplyFilter , "(コード Like '" & Me.コード1 & "')" DoCmd.ApplyFilter , "日付 between #" & 開始 & "# and #" & 終了 & "#" これをAndでフィルタリングしたいのですが、たとえばこのようにすると構文エラーとなります。 DoCmd.ApplyFilter , "(コード Like '" & Me.コード1 & "') and (日付 between #" & 開始 & "# and #" & 終了 & "#)" Andとしてはこのようにすれば機能することから、between以下がおかしいと思うのですが、自分ではわかりませんでした。 DoCmd.ApplyFilter , "(コード Like '" & Me.コード1 & "') and (コード Like '" & Me.コード2 & "')" ご教授いただければ幸いです。よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- DexMachina
- ベストアンサー率73% (1287/1744)
> Andでフィルタリングしたいのですが、たとえばこのようにすると構文エラーとなります。 提示された式に合うテキストボックスを作成して、同じ式で動作確認してみましたが、 『コード1・開始・終了のすべてに条件を指定』した場合、エラーは発生しませんでした。 (フィルタが正しく適用される) 一方、『コード1・開始・終了の少なくとも1つが空欄(Null)』の場合は、確かに構文 エラーが発生しました。 もしも、やりたい内容が「コード1のみを指定した場合は日付を無視」といったことだと したら、少し仕組みを考える必要があります。 以下、参考までに一例を提示します: (「開始」のみ指定時は「開始以降のもの」を、「終了」のみ指定時は「終了以前の もの」を、それぞれ抽出する形にしてみました) Private Sub フィルタ実行_Click() 'コマンドボタンを想定しました 'エラーが発生した場合の対応を宣言(→「エラー処理:」の行に飛ぶ) On Error GoTo エラー処理 '変数を宣言 Dim strFilter As String, iCode As Byte, iHead As Byte, iTail As Byte 'それぞれの入力状態を確認 iCode = IIf(IsNull(コード1), 0, 1) iHead = IIf(IsNull(開始), 0, 2) iTail = IIf(IsNull(終了), 0, 4) '入力状態に合わせてフィルタ式を作成 Select Case iCode + iHead + iTail Case 0 '0+0+0:全て空白 MsgBox "先に条件を指定してください。", , "確認" GoTo 終了処理 Case 1 '1+0+0:コード1のみ入力 strFilter = "コード Like '" & Me.コード1 & "'" Case 2 '0+2+0:開始のみ入力 strFilter = "日付 >= #" & 開始 & "#" Case 3 '1+2+0:コード1と開始を入力 strFilter = "(コード Like '" & コード1 & "') And (日付 >= #" & 開始 & "#)" Case 4 '0+0+4:終了のみ入力 strFilter = "日付 <= #" & 終了 & "#" Case 5 '1+0+4:コード1と終了を入力 strFilter = "(コード Like '" & コード1 & "') And (日付 <= #" & 終了 & "#)" Case 6 '0+2+4:開始と終了を入力 strFilter = "日付 Between #" & 開始 & "# And #" & 終了 & "#" Case 7 '1+2+4:全て入力 strFilter = "(コード Like '" & コード1 & "') And (日付 Between #" & 開始 & "# And #" & 終了 & "#)" End Select 'フィルタを適用 DoCmd.ApplyFilter , strFilter 終了処理: '処理を抜ける Exit Sub エラー処理: 'エラーが発生した場合はメッセージを表示して終了処理に移動 MsgBox Err & ":" & Error$, , Me.Name & " フィルタ実行" Resume 終了処理 End Sub ・・・以上です。 なお、現状では『コード』については『コード1』テキストボックスに「2」を指定すると 「コード=2」の完全一致検索になります。 (「2*」を指定すれば先頭一致、「*2」なら後方一致、「*2*」ならあいまい検索) もしかしたら意図的にそうされたのかもしれませんが、もし常にあいまい検索を希望 されるようでしたら、コード部分については "コード Like '*" & コード1 & "*'" という構文が必要になりますので、蛇足まで。
お礼
ご回答をありがとうございました。 『コード1・開始・終了のすべてに条件を指定』した場合でもエラーが出ますし、参考の通りにやってみましたが、やはり同じエラーが出ました。 開始、終了は非連結のテキストボックスですので、それが原因なのでしょうか? 構文エラーというところから、between 以下の書き方に問題があるような気がしています。 お返事が遅くなりまして、すみませんでした。 ありがとうございました。