【VBA解説】そもそもEOFとBOFとは?

Japanese

はじめに

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のお作法的なものでもあるのできっちり覚えておきましょう。

コメント

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