プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。
下記のフィルタはそれぞれ単独で機能しています。

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 & "')"

ご教授いただければ幸いです。よろしくお願いいたします。

A 回答 (1件)

> 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 & "*'"
という構文が必要になりますので、蛇足まで。
    • good
    • 0
この回答へのお礼

ご回答をありがとうございました。
『コード1・開始・終了のすべてに条件を指定』した場合でもエラーが出ますし、参考の通りにやってみましたが、やはり同じエラーが出ました。
開始、終了は非連結のテキストボックスですので、それが原因なのでしょうか?
構文エラーというところから、between 以下の書き方に問題があるような気がしています。

お返事が遅くなりまして、すみませんでした。
ありがとうございました。

お礼日時:2009/07/16 17:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す