Accessでフィルタをかける際のエラーについて

このQ&Aのポイント
  • Accessでフィルタをかける際に、変数に格納すると正常にフィルタがかかるが、変数を介さないとエラーになる場合があります。
  • 具体的には、rs.Filterプロパティを直接指定すると実行時エラーが発生することがあります。
  • エラーの原因は変数を介さないことにあり、変数に格納することで正常にフィルタがかかるようになります。
回答を見る
  • ベストアンサー

一度変数に格納すればフィルタができるのですが

Set cn = CurrentProject.Connection rs.Open "Qクエリ", cn, adOpenKeyset, adLockOptimistic myStr = "(数 = 0) And (名 = 'test') " rs.Filter = myStr なら問題なくフィルタができるのですが、 rs.Filter = "(数 = 0) And (名 = 'test') " とすると、 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 になります。 なぜか一度変数に格納すればフィルタができるのですが そんなことありますか? 変数を介さないとエラーになるなんてありますか? エラーの原因は変数を介さない事なのでしょうか? アクセスです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Access2010で試しました。 まず、クエリではなくテーブルで行った場合は どちらでも問題なくFilterが掛かりました。 クエリ中にワイルドカード(* ? など)があると ADOの場合クエリのSQL文を、ANSI-92規格として解析するようです。 この場合のワイルドカードは(% _ など)ですから どちらでもエラーにはなりませんでしたが 欲しい結果が得られなくなりました。 クエリはWHERE句で Like *文字* を入れている単純なものです。 http://okwave.jp/qa/q8666067.html の 30246kiku さんによる検証を読んでみてください。 当方では問題のエラーの再現が出来なかったのですが、 クエリ中のSQL文に問題が潜んでいるかもしれません。 なお、ADOではなくて DAO でならエラーにならないかもしれません Sub test() Dim db As Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Qクエリ") mystr = "(数 = 0) And (名 = 'test') " 'rs.Filter = mystr rs.Filter = "(数 = 0) And (名 = 'test') " Do Until rs.EOF Debug.Print rs.Fields(1) rs.MoveNext Loop rs.Close: Set rs = Nothing Set db = Nothing End Sub

rxumtfqaa
質問者

お礼

ありがとうございました。

関連するQ&A

  • ADOでアクセスのレコードに複数のフィルタをかけるには?

    Sub ADO() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = ("フィールド1 = " & "'" & 変数1 & "'") rs.Filter = ("フィールド2 = " & "'" & 変数2 & "'") Debug.Print rs.RecordCount Set rs = Nothing Set cn = Nothing End Sub だと最終的にはフィールド2のフィルタ後の個数しか取得できません。 rs.Filter = ("案件CD = " & "'" & 案件CD & "'" And "プロセス = " & "'" & プロセス & "'") だと「型が一致しません」になります。 どうすれば変数1と変数2のフィルタ後のレコードの個数を取得できるのでしょうか? ご教授よろしくお願い致します。

  • ADOでアポストロフィー入りの値をフィルタしたい

    例えばレコードの値が「あああ'ああ」だった場合、 ----------------------------------------------------- Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'あああ'ああ'" MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ----------------------------------------------------- とすると 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 になってしまいます。 ADOでアポストロフィー入りの値をフィルタする方法を教えてください。

  • ADO フィルタ 変数

    Sub test() Dim 月 As Long cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.FullName rs.Open "Tテーブル", cn, adOpenStatic, adLockPessimistic 月 = 5 rs.Filter = " 処理日 = '" & #"& 月 &"/29/2009# & "'" MsgBox rs.RecordCount Set rs = Nothing Set cn = Nothing End Sub のように月に変数を入れ、フィルタをかけたいのですが 上記のコードでエラーになってしまいます。 アドバイスよろしくお願いします。

  • access Ado フィルタ 含むができない

    バージョン2007です テーブル名:テーブル1 フィールド名:ファイル名 レコードには色々なファイル名が入っていて、テキストファイルだけを抽出したいのですが Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & CurrentProject.FullName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = "ファイル名 like '%.txt'" MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これをすると 実行時エラー 3001  引数が間違った型、許容範囲外、又は競合しています。なります。 しかもなぜかヘルプファイルが開けません。(画像をご参照ください) rs.Filter = "ファイル名 like '*.txt'" これに変えてもおなじです。 「含む」と言う条件で抽出したい場合はどうすればいいでしょうか? ご教授よろしくお願いします。

  • VBA ADOのフィルタのアポストロフィーの意味は

    VBAで文字列はダブルコーテーション「”」で括りますが ------------------------------------------------ Sub ADO_Filter() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T社員名簿", cn, adOpenKeyset, adLockOptimistic rs.Filter = "質問タイトル LIKE '*田*'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ------------------------------------------------ 上記の '*田*' のアポストロフィーはどういう時に必要なのでしょうか? LIKE演算子を使ってるからか Filterだからか など理由があれば教えて下さい。 また、「'」を使っているのに、以後がコメントにならないのも不思議です。 よろしくお願い致します。

  • アクセスADO 複数のレコードがあるのに-1が返る

    アクセスのADOを作っています。 テーブルにレコードは複数あるのですが、Filterをすると必ず-1が返ります。 どうしてでしょうか? エラーになってるのでしょうか? ---------------------------------------------------- Set cn = CurrentProject.Connection myStr = "test" rs.Open "Tテーブル", cn, adOpenForwardOnly, adLockReadOnly rs.Filter = ("フィールド1=" & "'" & myStr & "'") MsgBox rs.RecordCount ’マイナス-1になる rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ---------------------------------------------------- rs.Open の下に、MsgBox rs.RecordCountを置いても、-1になることから、Filter のせいではないと思うのですが 原因がわかりません。 ご教授よろしくお願いします。

  • 実行時エラー-2147217900(80040e1

    アクセスVBAです。 Set cn = CurrentProject.Connection rs.Open "T_test", cn, adOpenKeyset, adLockOptimistic としたときに、T_testと言うテーブル名は存在するのに、 「実行時エラー-2147217900(80040e14) SQLステートメントが正しくありません Delete、Insert、Procedure、SelectまたはUpdateを使用して下さい。」 と言うエラーが発生します。 どうしてテーブルが存在するのにこのエラーが発生するのでしょうか?

  • 「2月」でフィルタをかけたい。

    オフィス2003です。 テーブル1の 日付フィールドには「yyyy/mm/dd hh:nn」形式でいくつかの日付の入力されたレコードがあります。 エクセルのADOを使って テーブル1から「2月」のレコードをフィルタをかけて抽出したいのですがうまく行きません。 Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\db1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = ("日付 = " & "'" & Month(Date) & "'") rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub を実行すると「種類が一致しません」というエラーになります。 どうすれば2月のデータを取得できるのでしょうか? ご教授よろしくお願いします。

  • ADOでループすると1レコードずつ飛ばしてしまう

    アクセスなのですが Sub test() Set cn = CurrentProject.Connection rs.Open "テーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "(店名 = '" & str店名 & "') And (URL = '未')" For j = 1 To rs.RecordCount rs("URL") = "http" rs.Update rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub このようにして、既存のレコードにフィルタをかけて該当のレコードの値を更新しているのですが rs.MoveNext をいれると、 1レコード目、3レコード目、5レコード目・・・と言う順番になってしまい、 最終的にrs.RecordCountの数を越したレコードを指定してしまい 実行時エラー 3021 「BOFとEOFのいずれかTRUEになっていか、または現のレコードが要求された操作には、現在のレコードが必要です。」 となってしまいます。 だからって rs.MoveNextをいれないと、rs.RecordCountに達するまで、 いつまでも同じレコードをループしてしまいます。 1レコードずつ順番にデータを掴む方法を教えてください。

  • WHERE レコードが抽出されない

    ADOでSQL文を作ってるのですが WHERE句がうまくできません。 rs.Open "T_テーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "URL like '#*'" なら、うまくいくのですが、 Filterを使うのをやめて、WHEREに書きかえると、エラーにはならないのですが 取得レコードが0件になります。 rs.Open "T_テーブル WHERE [URL] like '#*';", cn, adOpenKeyset, adLockOptimistic も rs.Open "T_テーブル WHERE URL like '#*';", cn, adOpenKeyset, adLockOptimistic も、0件が返ります。 何がおかしいのでしょうか? URLフィールドで、#で始まるレコードを抽出したいです。

専門家に質問してみよう