こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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)
です。

ご教授よろしくお願いします。

投稿日時 - 2012-05-19 16:16:13

QNo.7484387

暇なときに回答ください

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

フィルターに文字列として渡さなくてはいけないので
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 & ")"
じゃないですか?未検証です。

投稿日時 - 2012-05-23 08:38:35

お礼

RS.Filter = "(URL = 'www.yahoo.co.jp' And 終了 = " & False & ") Or (URL = 'www.google.co.jp' And 終了 = " & False & ")"

で出来ました!!!ありがとうございました。

投稿日時 - 2012-07-07 22:42:03

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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) のように組み立てる必要が有ります。

投稿日時 - 2012-05-20 07:05:58

お礼

ご回答ありがとうございます。

説明不足ですいません。バージョンは2007です。

演算子の優先順位をよく見て考えるべきでしたね。

ちなみに
RS.Filter = ("URL = 'www.yahoo.co.jp' And 終了 = " & False) Or ("URL = 'www.google.co.jp' And 終了 = " & False)

にしてみたのですが
「型が一致しません。(Error 13)」になってしまいます。
何が間違ってるのでしょうか?

再度ご回答頂ければ幸いです。よろしくお願いします。

投稿日時 - 2012-05-21 21:08:16

ANo.1

こちらが参考になると思われます。

ADOでFilter
http://okwave.jp/qa/q3818384.html

投稿日時 - 2012-05-20 03:41:11

お礼

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

投稿日時 - 2012-05-21 21:07:30

あなたにオススメの質問