「これ固まってない? それとも計算中?」
大量のデータをVBAで処理しているとき、画面が白くなって「応答なし」の文字が出た瞬間の不安感といったらありませんよね。
私も昔、1時間かかる集計マクロを回している最中に不安になり、強制終了してしまったことがあります。あのまま待っていれば実はあと数秒で終わったかもしれません……。
そんな「処理待ちの不安」を解消し、マクロをプロっぽく仕上げてくれるのが「プログレスバー(進捗状況バー)」です。
今回は、初心者の方でも3分で実装できる、シンプルで効果的なプログレスバーの作り方を解説します。
なぜ「進捗の見える化」が重要なのか?
人間は「終わりが見えない作業」に対して、実際の時間よりも長く、苦痛に感じる性質があります。
これをITの世界では「ユーザー体験(UX)」と呼びますが、どの現場でも同じく重要です。
進捗バーを導入する主なメリットは以下の通りです。
- 安心感: 「あと20%で終わる」と視覚的に分かるだけで、待ち時間のストレスが大幅に軽減されます。
- 時間の有効活用: 処理が終わるまでの目安が立つため、次の業務の予定をスムーズに立てやすくなります。
- エラーの早期発見:バーが一定の箇所でピタッと止まったままになるため、本当のフリーズ状態を早期に判断できます。
プログレスバーの仕組み
プログレスバーの仕組みは、とてもシンプルです。
「細長い箱(背景)」の中に、「色がついた板(バー)」を置いて、その板の横幅を少しずつ伸ばしていくだけです。
100枚の書類を処理するなら、1枚終わるごとに板の長さを1%ずつ伸ばせば、100枚目で満タンになりますよね。
【実践】プログレスバーの実装ステップ
まずは、ユーザーフォームを1つ作りましょう(名前は UserForm1 とします)。
- 背景を作る: ラベル(Label1)を配置し、枠線をつけて背景を白にします。
- 動くバーを作る: もう一つのラベル(Label2)をLabel1の上に重ねます。背景色を青などの目立つ色にします。
- 初期値を設定: Label2の横幅(Width)を、最初は「0」にしておきます。
コピペで使えるコード
マクロのループ処理の中に、以下のコードを組み込むだけで動きます。
Sub SampleProgressBar()
Dim i As Long
Dim totalCount As Long
Dim progressPercent As Double
' 処理するデータの総数(例:1000行)
totalCount = 1000
' ユーザーフォームを表示(モーダル解除でマクロを止めない)
UserForm1.Show vbModeless
For i = 1 To totalCount
' --- ここに本来の処理を書く ---
' (例: セルの計算やデータ転記など)
' ----------------------------
' 1. 進捗率を計算する
' 現在の数 ÷ 全体の数
progressPercent = i / totalCount
' 2. バーの長さを更新する
' Label1(背景)の幅に対して、進捗率を掛け算する
UserForm1.Label2.Width = UserForm1.Label1.Width * progressPercent
' 3. %表示も更新(オプション)
UserForm1.Caption = "処理中... " & Format(progressPercent, "0%")
' これがないと、画面の更新が追いつかず「応答なし」に見えてしまいます
DoEvents
Next i
Unload UserForm1
MsgBox "処理が完了しました!"
End Sub
失敗から学んだ「DoEvents」の重要性
コード内にサラッと記述したDoEventsですが、これが本機能において最も重要なポイントとなります。
VBAは処理に集中すると「画面を書き換える」という仕事を後回しにしてしまいます。その結果、バーが動かず、結局フリーズしたように見えてしまうことがあります。
DoEvents は、VBAに「ちょっと一息ついて、画面を更新していいよ」と指示を出します。
これを忘れると、プログレスバーはただの「動かない絵」になってしまいますので注意しましょう。
プログレスバーを作る手間は、わずか数分です。たったそれだけで、毎日マクロを使う自分や同僚にとっては、重宝される機能になります。
ぜひ活用してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント