実行時エラー3021 | BOFとEOFのいずれかTRUEになっていか、または現のレコード要求された操作には、現在のレコードが必要です。

このQ&Aのポイント
  • 実行時エラー3021「BOFとEOFのいずれかTRUEになっていか、または現のレコード要求された操作には、現在のレコードが必要です。」というエラーが発生します。
  • コード上で「abc会社」がT_店名テーブルに存在し、地図フィールドはNullのようですが、Isnull(rs('地図'))がTrueにならず、実行時エラー3021が発生します。
  • 要約文3
回答を見る
  • ベストアンサー

実行時エラー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というエラーになってしまうようです。

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

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

> 実行時エラー3021「BOFとEOFのいずれかTRUEになっていか、または現のレコード要求された操作には、現在のレコードが必要です。」 Filter 後に このエラーが発生するのなら、 該当するレコードが無い、ということでしょう。 > 目で見た限り > "abc会社"は、T_店名テーブルに存在しますし、 > 地図フィールドはNullっぽいです。 「目で見た限り」 とか 「っぽい」 などと言ってないで きちんと確認しましょう。 それがデバッグというものです。

ahvdxeqtoje
質問者

お礼

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

その他の回答 (1)

  • kosamon
  • ベストアンサー率47% (11/23)
回答No.1

>目で見た限り"abc会社"は、T_店名テーブルに存在しますし、 >地図フィールドはNullっぽいです。 ヘルプより Null 値は、バリアント型 (Variant) に有効なデータが入っていないことを示す値であり、変数が初期化されていないことを示す Empty 値や、Null 文字列と呼ばれる長さが 0 の文字列 ("") とは異なります。 なんて事はありませんか?

ahvdxeqtoje
質問者

お礼

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

関連する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メソッドは不要だと思っています。

  • 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でNULLのレコードを抽出したい

    ADOでNULLのレコードを抽出したいのですがうまくできません。 Q全てクエリには、登録日フィールドや登録数フィールドがあります。 登録数フィールドは数値です。 その登録数フィールドがnullのレコードを抽出したいです。 RS.CursorLocation = adUseClient RS.Open "Q全て", cn, adOpenKeyset, adLockOptimistic RS.Sort = "登録日 DESC" RS.Filter = "[登録数] = NULL" RS.Filter = "IsNull(登録数) = True" RS.Filter = "登録数 Is Null" ↑これどれをやってもエラーになります。 対策をお願いします。

  • 実行時エラー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 この部分はコピペで、意味が分からないまま使っています。

  • スプレッドシートのnull表示

    win2000、vb6.0、スレッドシート3.0(文化オリエント)を使用しています。 1レコードの中から特定のフィールドだけスプレッドシートに表示し、更新できるようにしたいと考えています。 'ここまでで、レコードセットrsに1レコードセット。 Set SPR_Test.DataSource = rs SPR_TEST.col = 1 SPR_TEST.DataField = "data1" SPR_TEST.col = 2 SPR_TEST.DataField = "data2 ※上記でスプレッドシートにDBから数値型のデータを読み込んで表示しているのですが、nullのレコードが 0 で表示されています。 回避する為に、 SPR_TEST.col = 1 If IsNull(rs.Fields("data1")) Then   SPR_TEST.DataField = "" Else   SPR_TEST.DataField = "data1" End If SPR_TEST.col = 2 If IsNull(rs.Fields("data2")) Then   SPR_TEST.DataField = "" Else   SPR_TEST.DataField = "data2" End If と変更したのですが、今度はdata1,data2共にNullの場合、全くフィールドを指定していないので、他のフィールド全部表示してしまいます。 Nullは空白のまま表示したいのですが、方法はあるのでしょうか?

  • 実行時エラー -2147217887

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

  • 実行時エラー49 DLLが正しく呼び出せません。

    アクセス2010です。 今まで問題なく動いてたファイルなのですが Call マクロ1(str1, str2) Sub マクロ1(str1, str2) If ○○ Then If Form_F_Form.ck_OK.Value = 0 Then Exit Sub End If と言うところのExit Subで 実行時エラー49 DLLが正しく呼び出せません。 となります。 これはファイルが壊れているのでしょうか?

  • ACCESSでのフィールド名

    ACCESS2000を使っています。 テーブルに「時間:」というフィールドがあるのですが、 If IsNull(!時間:) Then  :  : というふうに使うとコンパイルエラーになります。 ”:”がまずいと思うのですが。 フィールド名を変更せずにNULLかどうか調べたいのです。 何かいい方法は無いでしょうか。

  • アクセスにてテーブル内の重複チェックについて

    下記の様なテーブル構成になっています。 大分類マスタ 大分類 長整数型 分類見出し 文字列 このテーブルにフォームから入力をさせているのですが重複チェックの時にvercheckのデータ形式が違いますと出てエラーが出ます。色々とデータ形式を変えたのですがうまくいきません。 どの様にすれば宜しいのでしょうか?ご教授頂きます様お願い致します。 尚、テーブルの数値を文字形式にすれば動作するのは分かっているのですが数値形式の場合の やり方を教えてください。 Dim str大分類 As String Dim str分類見出し As String Dim vercheck As Variant If IsNull(大分類) = False Then str大分類 = 大分類 vercheck = DLookup("大分類", "T大分類マスタ", "大分類='" & str大分類 & "'") If Not IsNull(vercheck) Then MsgBox ("同じ大分類番号があります") Exit Sub Cancel = True Else End If Else Exit Sub End If If IsNull(分類見出し) = False Then str分類見出し = 分類見出し vercheck = DLookup("分類見出し", "T大分類マスタ", "分類見出し='" & str分類見出し & "'") If Not IsNull(vercheck) Then MsgBox ("同じ分類見出しがあります") Exit Sub Cancel = True Else End If Else Exit Sub End If -------ここからフォームから直にテーブルに書いています。--------- Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T大分類マスタ", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs![大分類] = Forms!F大分類マスタ登録画面!大分類 rs![分類見出し] = Forms!F大分類マスタ登録画面!分類見出し rs.Update End Sub

  • NULLを含むフィールド値の条件分岐

    どなたかご存知の方はご教示願います。 使用言語はVB6_SP5、DBはMdb(アクセス97形式)です。 ADOでDBに接続し、レコードセットを取得しそのレコードの任意のフィールドの値により処理を3通りに分けたいのです。(値はNULL、"1"、"9" の3つです。) IF文で条件分岐を行いたいのですが、うまく振り分けができずにおります。 IF ISNULL(RS.FIELDS("HHH").VALUE) THEN NULLの場合の処理 ELSE "1"の場合の処理 END IF ' "9" の場合はなにもしない 結果は全てNULLの場合の処理を実行してしまいます。 どこを修正すれば宜しいのでしょうか?

専門家に質問してみよう