【入門編】DAOでレコードセットをループする際の「MoveNext」忘れを防ぐ定型パターン – Access VBA解析バイブル

スポンサーリンク

こんにちは。Accessという「データ操作の魔術書」を手に取った皆さん、ようこそ。

Access VBAの世界に足を踏み入れると、誰もが一度は遭遇する壁があります。それが「無限ループ」という名の、PCをフリーズさせる悪夢です。

今回は、DAO(Data Access Objects)を使ってレコードを一件ずつ処理する際、プロフェッショナルが必ず守っている「鉄壁の定型パターン」を伝授します。これさえマスターすれば、もう「画面が固まって強制終了」という悲劇とは無縁です。

—

なぜ「MoveNext」は忘れ去られるのか?

DAOでレコードセットを操作する際、私たちは「現在地」を指すポインタを動かしながら処理を行います。

  • MoveFirst: 最初のレコードへ行く
  • MoveNext: 次のレコードへ進む

コードを書いている最中、つい処理内容(If文や更新処理など)に集中してしまい、一番最後に書くべき`rs.MoveNext`を書き忘れる。これが無限ループの正体です。「ずっと同じ場所で足踏みをしている」状態ですね。

これを物理的に防ぐための「最強のテンプレート」を提示します。

—

鉄壁のDAOループ・テンプレート

このコードは、私が現場で新人に必ず教える「事故が起きない」書き方です。

Public Sub ProcessRecordsTemplate()
Dim db As DAO.Database
Dim rs As DAO.Recordset

‘ 1. オブジェクトのセット
Set db = CurrentDb
Set rs = db.OpenRecordset(“テーブル名”, dbOpenDynaset)

‘ 2. レコードが存在するか確認(重要!)
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst

‘ 3. 「EOF(末尾)」に達するまでループする
Do Until rs.EOF

‘ — ここにやりたい処理を書く —
Debug.Print rs!フィールド名
‘ ——————————

‘ 4. 「必ず」最後にMoveNextを書く(ここで忘れると地獄)
rs.MoveNext
Loop
End If

‘ 5. 後片付け(メモリリークを防ぐための儀式)
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

—

このコードの「本質」を理解する

1. `If Not (rs.EOF And rs.BOF)` の真意

これは「レコードが1件も存在しない」というケースを弾くためのガードです。空っぽのテーブルで`MoveFirst`を呼ぶとエラーになります。この一行があるだけで、プログラムの堅牢性が劇的に変わります。

2. なぜ `Do Until rs.EOF` なのか

`EOF`(End of File)は「最後のレコードを超えた先」を意味します。つまり、「ファイルが終わるまで繰り返せ」と指示しているわけです。非常に直感的で、読み間違いが起きにくい構文です。

3. メモリの「後片付け」はプロの礼儀

`Set rs = Nothing` を省略する人がいますが、これは「使い終わったコップをテーブルに放置する」ようなものです。Accessが重くなる原因の多くは、こうしたメモリの解放忘れにあります。最後に必ず「閉じて、消す」。これが開発者の嗜みです。

—

陥りやすいエラー:If文との共存

初心者がやりがちな失敗例がこちらです。

‘ 【悪い例】
Do Until rs.EOF
If rs!状態 = “完了” Then
‘ ここで条件分岐した結果、MoveNextを通り過ぎてしまった!
GoTo NextStep
End If
rs.MoveNext ‘ ← ここまで到達しない
NextStep:
Loop

`If`文の中で`GoTo`や`Exit Sub`を使うと、`MoveNext`が無視されてしまいます。
「MoveNextは、ループの最後に必ず一回だけ通る道に配置する」のが鉄則です。もし複雑な条件分岐が必要なら、`MoveNext`をループの最後尾に置く構造を崩さないようにしてください。

—

最後に:Accessの力を信じて

AccessのDAOは、非常に歴史が長く、それゆえに枯れた技術です。しかし、その分、非常に安定しており、Access内部のデータを触るなら、ADOよりもDAOの方が遥かに高速で親和性が高いのです。

今回紹介したテンプレートをコピー&ペーストするだけでなく、「なぜここでEOFをチェックするのか」「なぜ最後にNothingにするのか」という理由を噛み締めてみてください。

ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Accessを自在に操る、エンジニアの入り口に立っています。

また何か壁にぶつかったら、いつでもここへ戻ってきてくださいね。応援しています!

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