VBA ADOで複数条件のフィルタリングを行う方法について

このQ&Aのポイント
  • エクセルからアクセスヘADOで接続し、レコードをエクセルに書き出しています。具体的には、アクセスのTPWIDテーブルから特定の条件を満たすレコードをフィルタリングしています。
  • しかし、複数の条件を組み合わせたフィルタリングを実施する際にエラーが発生してしまいます。具体的には、RS.Filterの部分で「実行時エラー 3001 引数が間違った型、許容範囲外、又は競合しています」というエラーが表示されます。
  • さらに、フィルタリング後のレコード数も0件となっています。条件としては、URLフィールドが「www.yahoo.co.jp」または「www.google.co.jp」を含み、かつ終了フィールドがチェックされていないことです。
回答を見る
  • ベストアンサー

VBA ADO 複数条件のフィルタ

エクセルからアクセスヘADOで接続し、レコードをエクセルに書き出しています。 アクセスのTPWIDには、 「URL」フィールド(テキスト型) 「終了」フィールド(YesNo型) があります。 (主キーは他のフィールド) エクセルVBAで --------------------------------------------------------- Sub test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\テーブルのみ.mdb" RS.Open "SELECT * FROM TPWID", CN, adOpenStatic, adLockOptimistic RS.Filter = "終了 = " & False RS.Close: Set RS = Nothing End Sub --------------------------------------------------------- とする分には問題なくできますが、実際行いたい行為は下記なのですが RS.Filter の部分で、 「実行時エラー 3001 引数が間違った型、許容範囲外、又は競合しています」 と言うエラーになってしまいます。 --------------------------------------------------------- Sub test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\テーブルのみ.mdb" RS.Open "SELECT * FROM TPWID", CN, adOpenStatic, adLockOptimistic RS.Filter = "URL = '" & "www.yahoo.co.jp" & "' or URL = '" & "www.google.co.jp" & "' And 終了 = " & False RS.Close: Set RS = Nothing End Sub --------------------------------------------------------- RS.Filter = "URL = '" & "www.yahoo.co.jp" & "' or URL = '" & "www.google.co.jp" & "' And 終了 = " & False を RS.Filter = "URL = '" & "www.yahoo.co.jp" & "' and URL = '" & "www.google.co.jp" & "' And 終了 = " & False にすれば、エラーは発生しませんが その次のコードを実行しようとすると 「実行時エラー'3021' BOFとEOFのいずれかTRUEになっていか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」 となってしまいます。 MsgBox RS.RecordCount で件数を取得したら0件なので、それでエラーになります。 条件としては、 URLフォールドでは ・www.yahoo.co.jp ・www.google.co.jp のどちらかの文字列を含み、なおかつ 終了フィールドにチェックがついてない(値は0) です。 ご教授よろしくお願いします。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

フィルターに文字列として渡さなくてはいけないので RS.Filter = ("URL = 'www.yahoo.co.jp' And 終了 = " & False) Or ("URL = 'www.google.co.jp' And 終了 = " & False) ↓ RS.Filter = "(URL = 'www.yahoo.co.jp' And 終了 = " & False & ") Or (URL = 'www.google.co.jp' And 終了 = " & False & ")" じゃないですか?未検証です。

nu87uir
質問者

お礼

RS.Filter = "(URL = 'www.yahoo.co.jp' And 終了 = " & False & ") Or (URL = 'www.google.co.jp' And 終了 = " & False & ")" で出来ました!!!ありがとうございました。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

Officeのバージョンはいくつでしょう。 2010ではAccessでもExcelでもVBEの画面でヘルプ(F1キー)で 論理演算子で調べると、『演算子の優先順位』の説明が有ります。 算術演算子(+-*/)の 1+2*3 ≠ 9 、1+2*3 = 7 と同様に 論理演算子ではAnd が先に評価されその後で Or を評価します。 なので ・www.yahoo.co.jp ・www.google.co.jp のどちらかの文字列を含み、なおかつ 終了フィールドにチェックがついてない(値は0) はイメージ的には(手抜き回答ですが) yahoo OR google AND false では、 google AND false の評価を行い、 『それから得たもの』 OR yahoo の評価に進みます。 ですので、 (yahoo AND false) OR (google AND false) のように組み立てる必要が有ります。

nu87uir
質問者

お礼

ご回答ありがとうございます。 説明不足ですいません。バージョンは2007です。 演算子の優先順位をよく見て考えるべきでしたね。 ちなみに RS.Filter = ("URL = 'www.yahoo.co.jp' And 終了 = " & False) Or ("URL = 'www.google.co.jp' And 終了 = " & False) にしてみたのですが 「型が一致しません。(Error 13)」になってしまいます。 何が間違ってるのでしょうか? 再度ご回答頂ければ幸いです。よろしくお願いします。

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.1

こちらが参考になると思われます。 ADOでFilter http://okwave.jp/qa/q3818384.html

nu87uir
質問者

お礼

私の質問と同じような内容ですね。 よく見てみます ありがとうございました。

関連するQ&A

  • 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でアポストロフィー入りの値をフィルタする方法を教えてください。

  • 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だからか など理由があれば教えて下さい。 また、「'」を使っているのに、以後がコメントにならないのも不思議です。 よろしくお願い致します。

  • 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'" これに変えてもおなじです。 「含む」と言う条件で抽出したい場合はどうすればいいでしょうか? ご教授よろしくお願いします。

  • ADO 英語を含むレコードを抽出したい

    テーブルに保存されてるフィールド1の英語が含まれているレコード(ABC株式会社 など)を抽出したいのですが 方法がわかりません。 *[a-z]* を使うんだなと思いますが、フィルタのかけかたがわかりません。 Sub test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ファイル名 RS.Open "テーブル1", CN, adOpenStatic, adLockOptimistic RS.Filter = "フィールド1 = " '←ここをどうすればいいでしょうか? RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub サンプルを作ってみたのですが ご教示頂けないでしょうか? よろしくお願い致します。

  • 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】「Filter」を使うか「WHERE」を使うか

    こんばんは。 アクセス2003です。 「Filter」を使うか「WHERE」を使うかべきかわからないので教えてください。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Sub test1() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル WHERE 'フィールド1'='りんご", cn, adOpenKeyset, adLockOptimistic rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub Sub test2() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'" & "りんご" & "'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上のふたつのステートメントは Tテーブルのフィールド1にりんごの文字が入力されているレコート゛を抽出します。 いくつかこのような動作をするプログラムを書くのですが どちらのほうがコート゛として適していますか? WHEREを使うtest1の方がコート゛が短くなるからいいのでしょうか? というのもいつかこのファイルを引き継ぐので他人が見てもわかりやすくしたいです。 よろしくお願い致します。

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • 「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月のデータを取得できるのでしょうか? ご教授よろしくお願いします。

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • ADOでテーブルにハイパーリンクを追加したい(アドレスと表示文字列は別)

    アクセスのtblのURLフィールドに 表示文字列→aaa URL→http://www.yahoo.co.jp/ を追加したいのですがうまくいきません。 (URLフィールドのデータ型はハイパーリンク型です) Sub test() Dim moji As String Dim URL As String 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:\Documents" & "\access.mdb" Set rs = New ADODB.Recordset rs.Open "tbl", cn, adOpenStatic, adLockPessimistic moji = "aaa" URL = "http://www.yahoo.co.jp/" rs.AddNew rs("URL") = "#" & moji & "#" rs("URL") = "#" & URL & "#" rs.Update Set rs = Nothing Set cn = Nothing End Sub を実行すると 結果は 表示文字列もアドレスも「http://www.yahoo.co.jp/」になってしまいます。(そりゃそうか) どうすれば 表示文字列→aaa URL→http://www.yahoo.co.jp/ が実現できるのでしょうか? よろしくお願いします。 (ヴァージョンは2003です)

専門家に質問してみよう