• 締切済み

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 & "')" ご教授いただければ幸いです。よろしくお願いいたします。

みんなの回答

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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 & "*'" という構文が必要になりますので、蛇足まで。

kami21
質問者

お礼

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

関連するQ&A

  • Access2007  DoCmd.ApplyFilterについて

    お世話になっております。 このように書けばコード1のみが抽出されますが、1以上にしたい場合はどのように書けば良いのでしょうか。 (0以外を指定したいと思います) DoCmd.ApplyFilter , "(コード Like '1')" ご教授いただければ幸いです。よろしくお願いいたします。

  • DoCmd.ApplyFilter引数を文字にする

    いつもお世話になっています。 以下のフィルタを作成して使っています。 Private Sub to12_Click() DoCmd.ApplyFilter , "([部署コード] = 1 And [社員番号]=2)" DoCmd.OpenForm "F_登録" Set Forms!F_登録.Recordset = Me.Recordset End Sub DoCmd.ApplyFilter , "([部署コード] = 1 And [社員番号]=2)" の [社員番号]にテキストを使用することになりました。 元テーブルも数値型からテキスト型に変更したのですが、 こうした検索の式に反映するにはどうしたらいいのでしょうか。 お力添えをお願いいたします。

  • ★アクセス2002★DoCmd.ApplyFilterの記述

    先日同じような質問をして回答頂きましたが再度お願いします。 住所検索フォームを作成中です。 住所検索フォームにテキストボックス[検索値]を配置して、[検索値]に入力した語句で始まるレコードを表示させています。[抽出開始]コマンドボタンに下記の様に記述していますが、これだと[住所]の頭の文字でしか抽出できません。[検索値]に入力する語句は必ずしも頭の文字ではないので、途中の一部の語句でもヒットするようにしたいのですが、上手く記述できずに困っています。 DoCmd.ApplyFilter , "[住所] Like '" & Forms![住所テーブル一覧]![検索値] & "*'"

  • Access2007 サブフォームでのフィルタ方法(DoCmd.ApplyFilter)

    お世話になっております。 フォームAに検索ボックスを作り、検索ボタンを押すと下記のようにフィルタをかけています。 Private Sub 検索_Click() DoCmd.ApplyFilter , "(分類名 Like '*" & Me.検索語 & "*')" End Sub このフォームAをフォームBのサブフォームとして使いたいのですが、そこで検索を実行すると”実行時エラー2491”が出てフィルタができません。 (フォームAとフォームB間のリンクはありません) 他の方法でもいいのですが、サブフォームでフィルタを実行したいと思います。 ご教授いただければ幸いです。よろしくお願いいたします。

  • 【アクセスVBA】テーブルにフィルタをかけたい

    Sub マクロ() DoCmd.OpenTable "Tテーブル", acViewNormal, acEdit DoCmd.ApplyFilter , "番号 = '123'" End Sub Tテーブルを開き、フィルタをかけたいのですが テーブルを開くまではできるのですが、 フィルタをかける行では 『ApplyFilter アクションの実行はキャンセルされました。』 になってしまいます。 DoCmd.OnFilter , "質問番号 = '0'" でもエラーになり、コードの実行すら行えません。 フォームではなくテーブルにフィルタをかけるにはどうすればいいでしょうか? よろしくお願いします。

  • 両方の条件でフィルターをかけたいです

    こんにちは。 今、フォームに別々に条件を指定し、抽出するようにしております。 (1) Private Sub コマンド65_Click() DoCmd.ApplyFilter , "[会場名] like '*" & Me.テキスト63 & "*' " Me.FilterOn = True Exit Sub Err_コマンド65_Click: MsgBox Err.Description End Sub (2) Private Sub コマンド70_Click() f_status = "施工日 >= '" & 開始日 & "'" f_status = f_status & " AND 施工日 <= '" & 終了日 & "'" Me.Filter = f_status Me.FilterOn = True End Sub 今の状態では正常に動くのですが、 条件が、(1)かつ(2)という条件でフィルターをかけなければ ならない、と作成してから気づきました。 いろいろやってみたのですが、 どれもエラーになるばかりで。。。

  • ACCESSのFILTERについて教えてください。

    いつも、お世話になっております。 以下について教えてください。 会社内のシステムのデータからACCESSでリンクを張って、日付(テキスト型)の絞り込み機能を作りたいと思い、以下のようにPGをくんだのですが、「直前の操作は取り消されました」と出て原因がわかりません。 (ちなみにYYYYMMDDの形で入力します。) Me.Filter = "[日付] >= " & Me.txt_開始 & "And" & "[日付] <= " & Me.txt_終了 Me.FilterOn = True BETWEENでやってみても同じでうまくいきませんでした。 すみませんが、原因とうまく行く対処法を教えてください。 お願いします。

  • 日付型と文字列型、両方にフィルタをするには

    アクセス フォームで日付型(Between and)と文字列型、両方にフィルタをするには? Private Sub cmd_ボタン1_Click() Me.Form.Filter = _ "日付 Between #" & Me.cmb_日付1.Value & "# And #" & Me.cmb_日付2.Value & "#" & _ " and 会社名 like " & "*" & Me.cmb_会社名.Value & "*" Me.Form.FilterOn = True End Sub これのどこが変なのか教えていただけますか? 実行時エラー3075「クエリ式の構文エラー:演算子がありません。」というエラーになります。

  • DLookup関数 アクセス

    開始日 2012/4/1 2013/4/1 終了日 2013/3/31 2014/3/31 金額 100,000 200,000 というテーブルのデータがある場合、 日付が2012/6/1なら 2012/4/1と2013/3/31の間だから、100,000を返す、 日付が2013/6/1なら 2013/4/1と2014/3/31の間だから、200,000を返す というvbaコードを作るにはどうすればいいでしょうか? Debug.Print DLookup("[金額]", "Tテーブル", "[開始日] = #2013/06/01# And [終了日] = #2013/06/01#") にすると、nullが返ってしまいますし 二つのフィールドをまたがってBetween andの使い方もわかりません。 コードを教えてください。ご教授よろしくお願いします。

  • Accessのフィルタについて

    Access2000を使っています。 フォームに配置した「TextBox1」と「TextBox2」(両者とも日付/時刻型)を引数として指定範囲の抽出をすべく Me.Filter="検索結果 Between #"& TextBox1 &"# And #"& TextBox2 &"#" Me.FilterOn=True (「検索結果」はテーブルに配置したフィールドに連結) のコードをボタンのクリックイベントに設定しました。 ところが、例えば「TextBox1」に「01/02/03」、また、「TextBox2」に「01/05/04」を入力して、ボタンをクリックしても抽出されません。 フォームに戻って、フォームのプロパティで確認するとフィルタの欄に 「検索結果 Between #01/02/03# And #01/05/04#」と表示されておりコードに間違いはないと思われますが、フォームフィルタをかけてみると、検索結果のテキストボックスに「Between #03/01/02# And #04/01/05#」という具合に日付が「日/年/月」に置き変わって表示されています。これがコードを実行しても抽出されない原因だと思われるのですか、何故、このように日付が変わってしまうのでしょうか。また、どうすれば変わらないようにできるのでしょうか。 よろしくお願いします。