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

解決済みの質問

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

投稿日時 - 2013-12-21 10:48:53

QNo.8394968

困ってます

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

原因は、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 [テーブル].店名='来々軒';

投稿日時 - 2013-12-21 15:38:16

お礼

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

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

投稿日時 - 2013-12-22 13:30:29

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

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

回答(1)

あなたにオススメの質問