【入門編】DAO.Recordsetの「AbsolutePosition」を活用した進捗率表示のカスタマイズ – Access VBA解析バイブル

スポンサーリンク

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` を使った進捗表示は、あなたのコードが単なるスクリプトから、現場で信頼されるアプリケーションへ昇華するための第一歩です。

まずは、手元の小さなテーブルで試してみてください。自分の書いたコードが、画面の中で生き生きと動くのを見るのは最高の瞬間ですよ。

何か詰まったら、いつでも戻ってきてくださいね。あなたの挑戦を、心から応援しています!

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