dポイントプレゼントキャンペーン実施中!

アクセスなのですが

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レコードずつ順番にデータを掴む方法を教えてください。

A 回答 (1件)

原因は、CursorLocation が規定値の adUseServer になっているので


Rs.Filter してしまうと 正しく動いてくれません。

Set cn = CurrentProject.Connection
rs.CursorLocation = adUseClient '←追加
rs.Open "テーブル", cn, adOpenKeyset, adLockOptimistic

とするか Filter ではなく

rs.Open "SELECT * FROM テーブル WHERE 店名 ='" & str店名 & "' and URL ='未'", cn, adOpenKeyset, adLockOptimistic
'rs.Filter = "(店名 = '" & str店名 & "') And (URL = '未')"
とSQL中にWHERE句で指定します。

でも、更新クエリで片づけたほうが良さそうにも思えます。
UPDATE テーブル SET テーブル.URL = 'http'
WHERE [テーブル].URL='未' AND [テーブル].店名='来々軒';
    • good
    • 0
この回答へのお礼

rs.CursorLocation = adUseClient '←追加
を追加したら、問題なくできました!

更新クエリでもできるのですね。
rs.CursorLocation の意味も調べてみます。
ありがとうございました。勉強になりました。

お礼日時:2013/12/22 13:30

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