― 処理の「見えない時間」を可視化する ―
Excel VBAで時間のかかる処理を実行すると、
画面がフリーズしたように見え、
「止まったのか?」「落ちたのか?」が分からなくなることがあります。
本記事では、
UserFormを使って進捗バー(プログレスバー)を実装し、
進捗率・経過時間・残り時間を可視化する方法を紹介します。
処理速度を上げる話ではありません。
「処理中であることを正しく伝える」実装がテーマです。
実装イメージ
横に伸びる進捗バー
進捗率(%)
経過時間
残り時間(予測)
処理中の内容表示(ファイル名・工程名など)
構成概要
使用するもの
Excel VBA
UserForm
Labelコントロール
UserFormの主な部品
名前 用途
lblBack 進捗バーの背景
lblBar 進捗バー本体
lblInfo 進捗率・時間表示
lblFile 処理内容表示
※ Labelを使うことで描画が軽く、制御も簡単です。
実装コード
開始時刻を保持する
Option Explicit
Public startTime As Double
Public Sub StartProgress()
startTime = Timer
End Sub
Timer は秒単位で取得でき、進捗計測には十分
軽量で扱いやすいためVBA向き
進捗更新処理
Public Sub UpdateProgress(ByVal current As Long, ByVal total As Long, Optional msg As String = "")
Dim pct As Double
Dim elapsed As Double
Dim remain As Double
If total <= 0 Then total = 1
If current < 0 Then current = 0
If current > total Then current = total
pct = current / total
elapsed = Timer - startTime
If elapsed < 0 Then elapsed = elapsed + 86400 ' 日付またぎ対策
If pct > 0 Then
remain = elapsed / pct - elapsed
Else
remain = 0
End If
Me.lblBar.Width = Me.lblBack.Width * pct
Me.lblFile.Caption = msg
Me.lblInfo.Caption = _
Format(pct, "0%") & _
"(経過 " & Format(elapsed, "0.0") & "秒 / 残り 約" & Format(remain, "0.0") & "秒)"
DoEvents
End Sub
実装上のポイント
① 残り時間は「概算」でよい
正確な予測は不要
目安があるだけで待ち時間の不安は大きく減る
② DoEventsは必須
DoEvents
これがないとUIが更新されない
進捗バーが最後に一気に100%になる
表示するための進捗バーなら、必ず入れる
③ 処理内容を表示する
Me.lblFile.Caption = msg
「今、何を処理しているか」が分かる
複数ファイル・複数工程では特に有効
なぜ進捗バーが重要か
処理時間は同じでも、体感は大きく変わる
フリーズと誤解されなくなる
マクロへの信頼性が上がる
問い合わせ・不安が減る
パフォーマンス改善の前に、UX改善です。
応用例
CSV・ログ集計
フォルダ内ファイル一括処理
重い関数・集計マクロ
夜間バッチ前の手動実行ツール
Excel VBAでも、
「見せ方」を工夫すれば十分実用的です。
まとめ
Excel VBAでも進捗バーは簡単に実装できる
UserForm + Label で軽量に構成可能
残り時間表示はUX改善に効果大
DoEventsを忘れない
処理を速くするのが難しい場面でも、
「安心して待てる」仕組みは作れます。


