はじめに

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