【Access VBA】EOFの使い方とは?MoveNextとの関係を実例付きで解説

Access VBAでレコード処理を学び始めると、rs.EOFというコードをよく見かけます。
ただ、初心者だと、
- EOFって何?
- なぜ必要なの?
- MoveNextと何が関係あるの?
と迷いやすい部分です。
EOFは、「レコードの最後まで到達したか」を判定するためのものです。
この記事では、EOFの使い方とMoveNextとの関係を実例付きで解説します。
Access VBAのEOFとは
EOFとは、End Of Fileの略です。
Access VBAでは、「最後のレコードを超えたか」を判定するときに使います。
主にRecordsetと一緒に使用されます。
Recordsetとは?
Recordsetとは、テーブルやクエリのデータをVBAで操作するための仕組みです。
たとえば、社員テーブルのデータを1件ずつ読み込む場合に使います。

EOFがTrueになるタイミング
EOFは、最後のレコードを超えるとTrueになります。
| 状態 | EOFの値 |
|---|---|
| まだレコードがある | False |
| 最後まで到達した | True |
つまりEOF = Falseなら、まだ次のレコードが存在します。
逆にEOF = Trueなら、データの最後まで処理済みという意味になります。
EOFの基本的な使い方
EOFは、繰り返し処理で非常によく使われます。
代表的なのが、次のVBAです。
Do Until rs.EOF
基本サンプル
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("T_社員")
Do Until rs.EOF
Debug.Print rs!社員名
rs.MoveNext
Loop
rs.Closeコード全体の目的
T_社員テーブルの社員名を、1件ずつ順番に表示する処理です。
1行ずつ解説
Dim rs As DAO.Recordsetレコードセット用の変数を定義しています。
Set rs = CurrentDb.OpenRecordset("T_社員")
T_社員テーブルを開いています。
Do Until rs.EOFEOFがTrueになるまで繰り返します。
つまり、最後のレコードまで処理するという意味です。
Debug.Print rs!社員名現在レコードの社員名を表示しています。
rs.MoveNext次のレコードへ移動しています。これが非常に重要です。
Do Until rs.EOFの意味
初心者が最も混乱しやすいのが、
Do Until rs.EOFの意味です。
これは、EOFがTrueになるまで繰り返すという意味になります。
つまり、
- まだレコードがある → ループ継続
- 最後まで到達した → ループ終了
という流れです。
イメージすると理解しやすい
たとえば、社員データが3件あるとします。
| 社員ID | 社員名 |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
| 3 | 鈴木 |
処理の流れはこうなります。
- 田中を処理
- 佐藤を処理
- 鈴木を処理
- 最後を超える
- EOF=Trueになる
- ループ終了
この仕組みで、全レコードを順番に処理できます。
EOFとMoveNextの関係
EOFを理解するうえで、最重要なのがMoveNextです。
MoveNextとは?
rs.MoveNextは、次のレコードへ移動する命令です。
レコードセット処理では必須になります。
MoveNextを書き忘れると危険
初心者が最も多くやるミスが、MoveNextの書き忘れです。
Do Until rs.EOF
Debug.Print rs!社員名
Looこれは非常に危険です。
なぜなら、現在レコードが変わらないため、EOFがTrueになりません。
その結果、同じレコードを永遠に処理し続ける「無限ループ」になります。
実務でも非常に多いミス
実際の業務でも、
- MoveNext忘れ
- EOF条件ミス
- ループ終了条件ミス
は非常によく発生します。
そのため、
Do Until rs.EOF
処理
rs.MoveNext
Loopをセットで覚えるのがおすすめです。
EOFを使うときの注意点
空データにも注意する
レコードが0件の場合、最初からEOF=Trueになります。
つまり、ループ内の処理は1回も実行されません。
そのため、データ件数0件のケースも考慮する必要があります。
BOFとセットで使う場合もある
Access VBAには、BOFも存在します。
これは、「先頭より前」を表します。
実務では、
If rs.EOF Thenのように、データ存在チェックで使われることも多いです。
レコード処理は実務で非常に多い
Access VBAでは、
- データ出力
- CSV作成
- 一括更新
- 帳票作成
- データ集計
など、レコードを順番に処理する場面が非常に多くあります。
そのため、EOFはAccess VBAで必須レベルの知識です。
まとめ
EOFは、「最後のレコードまで到達したか」を判定するためのものです。
EOFとセットで重要なのが、rs.MoveNextです。
MoveNextを書き忘れると、無限ループになるため注意しましょう。
まずは小さなテーブルを作って、1件ずつデータを表示する処理から試してみるのがおすすめです。
コメント