実行時エラー3021とは?ADOでのループ処理における問題の解決方法

このQ&Aのポイント
  • ADOを使用してループ処理を行っている際に発生する実行時エラー3021とは、次のレコードが存在しない場合に発生するエラーです。
  • 具体的には、ループ処理の中で次のレコードに進むために `rs.MoveNext` を使用している際に、次のレコードが存在しない状態(EOF=End of File)になっている場合にエラーが発生します。
  • このエラーを解決するためには、ループ処理の前にレコードセットを開く処理を行う必要があります。また、ループ処理の中でEOFのチェックを行い、次のレコードが存在する場合にのみ `rs.MoveNext` を実行するようにします。
回答を見る
  • ベストアンサー

実行時エラー3021

For i = 1 To rs.RecordCount 番号 = rs("番号") rs.MoveNext Next こんな感じで、ADOでループしているのですが、 一番最後のレコードで、 実行時エラー3021 「BOFとEOFのいずれかTRUEになっているか、 または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 が発生します。 rs.Open "SELECT * FROM T全て", cn, adOpenStatic, adLockPessimistic この部分に問題があるのでしょうか? adOpenStatic, adLockPessimistic この部分はコピペで、意味が分からないまま使っています。

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

  • ベストアンサー
  • chayamati
  • ベストアンサー率41% (254/607)
回答No.2

------------------------------------------------ forループの判定は nextで実行されます For i = 1 To rs.RecordCount - 1 番号 = rs("番号") rs.MoveNext Next

FGBXBFTMQT
質問者

お礼

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

その他の回答 (1)

noname#206655
noname#206655
回答No.1

すみません、検証してませんが、MoveNext でレコードが最終を越えたとき出るエラーです。 でも、for i=1 から始まってますので、問題ないと思いますが、MoveNextの戻り値が「偽」でExitするようコーティングした記憶があります。 なので、For 文ではなく、Do 文で検証します。

FGBXBFTMQT
質問者

お礼

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

関連するQ&A

  • 実行時エラー3021「BOFとEOFのいずれかTR

    Sub test() Set cn = CurrentProject.Connection rs.Open "T分類", cn, adOpenStatic, adLockPessimistic rs.Filter = "中分類 = '不明' And (大分類 <> '不明')" For i = 1 To rs.RecordCount str大分類 = rs("大分類") rs("中分類") = str大分類 & "(不明)" rs.Update rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub アクセスADOで上記のようなコードなのですが よく意味の分からないエラーが発生します。 コードの内容は 大分類が不明ではなく中分類が不明なら 中分類のレコードに大分類の値+不明にする です。 例えば該当のレコードが8レコードあれば i=5の時に、 実行時エラー3021「BOFとEOFのいずれかTRUE になっているか、 または現在のレコードが削除されています。 要求された操作には、 現在のレコードが必要です。」 が発生します。 規則としては rs.RecordCountの半分の値までは大丈夫ですが rs.RecordCountの半分+1の時に 上記のエラーが発生します。 ADOでデータの追加をする時にAddNewメソッドを入れ忘れた場合も 上記と同じエラーが発生しますが 今回のコードはフィルターをかけ 更新したいレコードを掴んでいるので AddNewメソッドは不要だと思っています。

  • BOF と EOF のいずれかが True になっ

    アクセスVBAです。 rs.Open "Q内容", cn, adOpenStatic, adLockPessimistic For intNo詳細 = 1 To rs.RecordCount Call 詳細テーブル_rs_1行のレコードを生成する rs.MoveNext Next intNo詳細 --------------------------------------------------------- の様に、loopしているのですが、 intNo詳細の最高値が100の場合、100の時に、 「BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」 と言うエラーになっています。 ADOで更新・削除・追加は行っていません。 テーブルのデータを取得しているだけです。 それなのになぜ最後の値でエラーになるのでしょうか? AbsolutePageとAbsolutePositionは、adPosEOFになっています。

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

  • ADOで現在のレコードの次のレコードの値も取得

    ADOで現在のレコードの次のレコードの値も取得するには? アクセスに対してADOでデータを取得しているのですが 例えばテーブルに フィールド1 あああ いいい ううう と入ってる時に、1レコード目のあああの値を取得しているときに、同時に次のレコードのいいいの値も取得することは可能ですか? Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM テーブル1", cn, adOpenStatic, adLockPessimistic For i = 1 To rs.RecordCount MsgBox rs("フィールド1") '現在のレコード MsgBox rs("フィールド1") + 1 '次のレコード rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これだとダメなようです。 あああ いいい が表示されるようにしたいのですが、どうすればいいか教えてください。

  • ADO VBA 実行時エラー3021

    rs.Open "SELECT * FROM Tログイン WHERE サイト名='" & サイト名 & "'", cn, adOpenStatic, adLockOptimistic rs("日時") = Now() rs.Update このコードを実行しようとしたときに、 実行時エラー3021「BOFとEOFのいずれかTRUEになっているか、 または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 と言うエラーが発生する場合があるのですが、 どういう意味のエラーなのかが良くわかりません。 ちなみに、 rs("日時") = Now() をコメントアウトして、 rs.Updateのコードを実行しても、同じエラーが発生します。

  • ado loop

    アクセスのADOでレコードをループする時に For i = 1 To rs.RecordCount ごにょごにょ Next じゃない方法でループする方法があったと思いますが どういうのでしたっけ?  BOFとか使うものです。

  • 実行時エラー3021

    実行時エラー3021「BOFとEOFのいずれかTRUEになっていか、または現のレコード要求された操作には、現在のレコードが必要です。」 というエラーが発生します。 エラーになるコードの一部を掲載します。 コードの内容は、アクセスのT_店名テーブルで、str店名の値同じレコードの地図フィールドの値を取得する内容です。 地図フィールドがnullなら何も取得しないようにifステートメントで分けています。 ------------------------------------------------------------ str店名="abc会社" rs.Open "SELECT * FROM T_店名", cn, adOpenStatic, adLockPessimistic rs.Filter = "店名 = '" & str店名 & "'" If IsNull(rs("地図")) = True Then Else ’ここでエラーになる str地図 = rs("地図") End If rs.Close: Set rs = Nothing ------------------------------------------------------------ "abc会社"は、コード上(VBA上) IsNull(rs("地図")) = True では、Falseになってしまい、 str地図 = rs("地図") でエラーになります。 目で見た限り "abc会社"は、T_店名テーブルに存在しますし、 地図フィールドはNullっぽいです。 なのになぜ If IsNull(rs("地図")) = True Then で、True にならないのでしょうか? True にならないために、 str地図 = rs("地図") で、実行時エラー3021というエラーになってしまうようです。

  • 実行時エラー -2147217887

    一つのアクセスファイルに エクセルからADOでデータを追加しているのですが その外套のアクセスファイルも捜査をしているタイミングで 実行時エラー -2147217887 他のユーザー が同じデータに対して同時に更新を試みているので、 プロセスが停止しました。 と表示されますが このエラーを表示せず、エクセルADOを優先されるには どういうコードにすればいいですか? ちなみに一度中断モードにして 同じコードを再度実行しようとすると 実行時エラー -2147217887 Update または CancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です とエラー内容が変わります。 コードは rs.Open "SELECT * FROM テーブル", cn, adOpenStatic, adLockPessimistic rs.Filter = "番号 = " & 番号 rs("フィールド") = str文字 ’ココでエラー の時です。

  • アクセスでADO 並べ替えが適用できない

    アクセスでADOを使っているのですが、 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "SELECT * FROM Q1", cn, adOpenStatic, adLockPessimistic rs.Sort = "受付日 DESC" For i = 1 To rs.RecordCount ・ ・ ・ このようなコードを作っていますが、 rs.Sortの部分で、「並べ替えを適用できません」になります。 レコード数は、15000件くらいです。 なぜ並べ替えができないのでしょうか? しょうがないからクエリで最初から並べ替えしておきますが、原因を教えてください。

  • adoでBetween は使えないのでしょうか?

    ADOで期間で抽出したいのですが rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 = #2015/01/01#" は問題なく通るのですが、 rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 Between #2015/01/01# And #2015/01/31#" だと 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 と言うエラーになります。 adoでBetween は使えないのでしょうか?

専門家に質問してみよう