はじめに
EOFとBOFって単語がエラーなどで出現するけどそもそもなに?
って思うこともあると思います。
Access VBA や ADO(ActiveX Data Objects)で扱う Recordset(レコードセット) を理解するうえで、EOFとBOFはとても重要な概念なので説明していきます。
まずRecordsetとは
▼SQL実行コード
rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
このように Recordset オブジェクト(rs)を開くと、
SQLの実行結果が「表(テーブル)」のようにメモリ上に読み込まれます。
つまり rs は、結果データの一覧を持つ入れ物です。
その中を「カーソル(現在位置)」で動かして、1行ずつ読んでいきます。
EOFとBOF
プロパティ | 意味 | 状況 |
EOF = End Of File | 「最後のレコードの後ろにいる」 | レコードの終わりを超えた状態 |
BOF = Beginning Of File | 「最初のレコードの前にいる」 | レコードの先頭より前にいる状態 |
イメージ

通常、rs.Open直後は 1件目を指している
rs.MoveNext で次へ移動すると、最後の次で EOF=True
rs.MovePrevious で戻ると、先頭より前で BOF=True
レコードが0件のときの状態
もしSQLの結果が 1件もなかった 場合、
Recordsetはこうなります:
[BOF][EOF] ←どちらもTrue
つまり「前にも後ろにもレコードがない」状態です。
この状態でrs.Fields(“列名”)にアクセスすると、
実行時エラー3021:BOFまたはEOFがTrueのとき、現在のレコードはありません
というエラーになります。
ではどうすれば実行時エラーを回避するのか?
以下の記事で紹介しているので是非見てみてください。
まとめ
いかがでしょうか。
EOFは”最後”(End)、BOFは”最初”(Beginning)と覚えておけばとりあえず流したSQLの何が存在して存在しないのかわかるかなと思います。
VBAのお作法的なものでもあるのできっちり覚えておきましょう。
コメント