Access VBAの極意:DAO.Recordsetと「AbsolutePosition」で処理を可視化する
こんにちは。業務自動化の世界へようこそ。
Accessで数万件のデータをループ処理する際、真っ白な画面のままフリーズしたような不安に駆られたことはありませんか?「本当に動いているのか?」「あと何分かかるんだ?」という焦燥感は、エンジニアにとって最大の敵です。
今回は、DAO.Recordsetの`AbsolutePosition`というプロパティを使い、処理の進捗率をリアルタイムに表示する「プロの作法」を伝授します。これさえマスターすれば、あなたのプログラムは「ブラックボックス」から「頼れる相棒」へと進化します。
—
1. なぜ「AbsolutePosition」なのか?
VBAでレコードを扱う際、私たちは通常 `Do While Not .EOF` を使って一つずつカーソルを移動させます。しかし、コンピュータは「今何番目にいるか」を自動的には教えてくれません。
ここで登場するのが `AbsolutePosition` です。
これは、レコードセット内の現在の行番号(0から始まるインデックス)を指し示すプロパティです。これと `RecordCount`(総件数)を組み合わせれば、進捗率(%)は簡単に計算できます。
注意:このプロパティを使うための「必須条件」
`AbsolutePosition` は、クエリやテーブルのタイプによっては値が取得できないことがあります。基本的には、`dbOpenDynaset` または `dbOpenSnapshot` で開くようにしてください。
—
2. 実装コード:進捗率表示のテンプレート
それでは、ステータスバーに進捗を表示するコードを見てみましょう。このパターンを一つ覚えれば、どんなデータ処理にも応用可能です。
Public Sub ProcessRecordsWithProgress()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim totalCount As Long
Dim currentPos As Long
Dim percent As Integer
Set db = CurrentDb
‘ Dynasetで開くことでAbsolutePositionを確実に利用可能にする
Set rs = db.OpenRecordset(“T_大量データテーブル”, dbOpenDynaset)
If rs.EOF Then Exit Sub
‘ 全件数を取得(これがないと進捗率が出せない)
rs.MoveLast
totalCount = rs.RecordCount
rs.MoveFirst
‘ 処理開始
Do While Not rs.EOF
‘ 1. 現在の行位置を取得 (0から始まるので+1する)
currentPos = rs.AbsolutePosition + 1
‘ 2. 進捗率を計算
percent = Int((currentPos / totalCount) 100)
‘ 3. ステータスバーに表示
SysCmd acSysCmdSetStatus, “処理中… ” & percent & “% 完了 (” & currentPos & “/” & totalCount & “)”
‘ — ここに本来の重い業務処理を記述 —
‘ DoEventsを挟むと画面が固まらないので推奨
DoEvents
‘ ————————————
rs.MoveNext
Loop
‘ 終了処理
SysCmd acSysCmdClearStatus
rs.Close
Set rs = Nothing
Set db = Nothing
MsgBox “処理が完了しました!”, vbInformation
End Sub
—
3. ここがポイント!初学者が陥りやすい罠
コードをコピペするだけでなく、以下の「現場の知見」もぜひ持ち帰ってください。
- `rs.MoveLast` の重要性
Accessは「必要な分だけ」データを読み込む性質があります。そのため、処理前に一度 `MoveLast` をしないと、`RecordCount` が正しく「全件数」を返さないことがあります。必ず最初に全件確定させましょう。
- `DoEvents` という魔法
ループの中に `DoEvents` を入れることで、VBAはOSに「操作を受け付ける余裕」を与えます。これがないと、進捗率が画面に反映される前にWindowsが「応答なし」と判断してしまいます。
- 計算のタイミング
`AbsolutePosition` は0から始まります。もし100件のレコードがあるなら、`AbsolutePosition` は0から99まで動きます。計算時には必ず `+1` して、人間が直感的にわかる数字に変換するのがコツです。
—
4. さらなる高みへ:独自フォームでの表示
ステータスバーだけでなく、独自に「プログレスバーフォーム」を作ると、よりプロフェッショナルなツールになります。
ラベルコントロールの `Width` を `percent` に合わせて動的に変更すれば、視覚的に美しい進捗バーを作成可能です。
ステップアップのヒント
- 処理が速すぎる場合: 1件ごとに更新すると逆に処理が遅くなります。`If currentPos Mod 100 = 0 Then` といった条件を使い、100件に1回だけ更新するようにすると、パフォーマンスを落とさずに安定した表示ができます。
—
最後に:エンジニアとしての誇り
「コードを動かすこと」と「ユーザーを安心させること」。
この二つを両立させるのが、真の自動化エンジニアです。`AbsolutePosition` を使った進捗表示は、あなたのコードが単なるスクリプトから、現場で信頼されるアプリケーションへ昇華するための第一歩です。
まずは、手元の小さなテーブルで試してみてください。自分の書いたコードが、画面の中で生き生きと動くのを見るのは最高の瞬間ですよ。
何か詰まったら、いつでも戻ってきてくださいね。あなたの挑戦を、心から応援しています!
