こんにちは。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を自在に操る、エンジニアの入り口に立っています。
また何か壁にぶつかったら、いつでもここへ戻ってきてくださいね。応援しています!
