【入門編】【初心者】DAO.Recordsetの「EOF」判定の落とし穴:レコードが存在しない場合の安全なループ処理 – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へ:DAO.Recordsetの「EOF」を制する者がデータベースを制する

こんにちは。現場で「動けばいい」コードから「壊れない」システムへと脱皮を目指す皆さん、ようこそ。

Access開発において、`DAO.Recordset`は避けては通れない、まさに心臓部です。しかし、初心者が最初に躓き、そして中級者になっても時折足元をすくわれるのが、「レコードが空だった時の処理」です。

今日は、DAOの`EOF`(End of File)と`BOF`(Beginning of File)という、一見地味なプロパティに隠された「データベース操作の哲学」を解説します。ここさえクリアすれば、あなたのAccess VBAは一段上の安定性を手に入れるはずです。

1. なぜ「EOF」だけでは不十分なのか?

多くの初心者が最初に書くループは、こうなりがちです。

‘ 悪い例:これだけでは不十分
Set rs = CurrentDb.OpenRecordset(“SELECT FROM T_受注管理”)
Do While Not rs.EOF
Debug.Print rs!顧客名
rs.MoveNext
Loop

一見、問題なさそうですよね? しかし、もしテーブルが空だったらどうなるでしょうか。`EOF`は最初から「真(True)」になるため、ループには入りません。それはそれで動きます。

問題は「レコードセットを開いた瞬間」の状態にあります。

データベースの世界では、レコードセットを開いた時、カーソルは常に「最初のレコード」にあるとは限りません。特にレコードが存在しない場合、カーソルは「どこにもいない(BOFでもあり、EOFでもある)」という特異点に置かれます。

2. 鋼鉄のループ処理:黄金のパターン

プロの現場で「絶対に落ちない」コードを書くための、唯一無二の定石がこれです。

Sub SafeRecordsetLoop()
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb
‘ テーブルを開く
Set rs = db.OpenRecordset(“SELECT FROM T_受注管理”, dbOpenDynaset)

‘ 【重要】レコードが存在するかチェックする
If rs.EOF And rs.BOF Then
Debug.Print “レコードは1件もありません。”
Else
‘ レコードがある場合のみループ開始
rs.MoveFirst ‘ 念のため最初へ移動
Do Until rs.EOF
Debug.Print rs!顧客名
rs.MoveNext
Loop
End If

‘ 後始末(オブジェクトの開放は自動化の美学です)
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

なぜこの形が最強なのか?

1. `If rs.EOF And rs.BOF Then` で切り分ける:
これが「レコードが1件もない」状態を判定する唯一の確実な方法です。両方がTrueなら、そこにデータはありません。ここで先に弾くことで、後続の処理でエラーが出るリスクをゼロにします。
2. `rs.MoveFirst` の儀式:
慣れてくると省略したくなりますが、明示的に「先頭から始めるぞ」という宣言をすることで、将来的な仕様変更や複雑なカーソル移動にも耐えうるコードになります。
3. `rs.Close` と `Nothing`:
Access VBAはメモリ管理が甘くなりがちです。使い終わったオブジェクトを自ら解放する癖をつけましょう。これが、長期間稼働するシステムを支えるエンジニアの気遣いです。

3. 初心者が陥る「エラーの罠」

よくあるエラーメッセージに「BOF または EOF が真であるか、現在のレコードが削除されています」というものがあります。

これは、「中身がないのに、無理やりレコードを読もうとした時」に発生する悲鳴です。

  • データがないのに `rs!フィールド名` を参照した
  • ループを抜ける条件を間違えて、存在しないレコードへ `MoveNext` した

これらのエラーは、先ほどの「黄金パターン」のように、最初に「データが存在するかどうか」を物理的に確認するガード節(Guard Clause)を設けるだけで、99%防ぐことができます。

最後に:コードは「対話」である

VBAを書くということは、データベースという「見えない相手」と対話することです。

「データはある?」「ないなら何もしないでね」「あるなら最後まで付き合ってね」

コンピュータにそのように優しく語りかけるようにコードを書いてみてください。そうすれば、Accessは気難しいツールではなく、あなたの最強の相棒へと変わります。

もし今日、あなたの書いたコードが期待通りに動かなくても、落ち込まないでください。それは、あなたのシステムが少し賢くなるための「成長痛」です。一つずつ理解していけば、Access VBAの奥深さは必ず見えてきますよ。

それでは、素晴らしい開発ライフを!

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