【解決】実行時エラー ‘3021’:BOF または EOF が True のときは、現在のレコードはありません。

Access VBA

はじめに

実行時エラー ‘3021’:BOF または EOF がTrueの時は、現在のレコードがありません。というエラーは比較的に目にすることが多いかなと思います。
このエラーは基本的に流したSQL結果のレコードがない状態でなにかを行うと出現します。

そんな実行時エラー ‘3021’の出現に関しての解決させる一例を紹介していきます。

問題のコード

存在CHK:
    '各項目入力時の時チェック
  mySQL = "SELECT * FROM テーブル WHERE 商品コード = 120"
    
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    ' ▼ SQL実行
    rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
    
    'セット商品の時
    If Nz(rs.Fields("セットフラグ").Value, 0) <> 0 Then
        Me.txt_個体コード = 0
        Exit Function
    End If

例えばこのようなコード。
一見問題ないように見えますが、SQL実行結果が0件の場合IF文でエラーを起こします。

古い接続方法のOO4Oではレコードが0件だったとしてもコードは無視してプログラムが進行しましたが、ADOではそうはいきません。

解決

存在CHK:
    '各項目入力時の時チェック
  mySQL = "SELECT * FROM テーブル WHERE 商品コード = 120"
    
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    ' ▼ SQL実行
    rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
    
    ' ▼ レコードが存在するか確認
    If rs.EOF And rs.BOF Then
        MsgBox "該当データが存在しません", vbExclamation
        Exit Function
    End If

    'セット商品の時
    If Nz(rs.Fields("セットフラグ").Value, 0) <> 0 Then
        Me.txt_個体コード = 0
        Exit Function
    End If

SQLを実行後、きちんとデータが存在しているか確認するコードを挟みましょう。
そうすることでデータが存在しなくてもきちんとエラーが出る前に回避することができます。

タイトルとURLをコピーしました