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の奥深さは必ず見えてきますよ。
それでは、素晴らしい開発ライフを!
