ExcelVBAで時間のかかる処理を実行していると、次のように思うことはありませんか?
- 今どこまで進んでいるのか分からない
- 止まっているのか動いているのか不安になる
- ユーザーに進捗を分かりやすく見せたい
こうしたときに便利なのが、進捗バー(プログレスバー)です。
この記事では、Excelの図形を使って、VBAで進捗バーを作る方法を初心者向けに解説します。
この記事でできること
- 図形を使って進捗バーを作成できる
- 処理の進行に応じてバーを伸ばせる
- %表示も一緒に出せる
- 実務マクロに組み込める
完成イメージ
今回作る進捗バーは、次のようなシンプルなものです。
- 背景用のバー(枠)
- 進行に応じて伸びる色付きバー
- 進捗率(例:50%)の文字表示
Excel上に表示されるので、ユーザーにとっても分かりやすいのが特徴です。
基本コード(コピペOK)
まずは進捗バーを作成して、0%→100%まで動かすサンプルです。
Option Explicit
Sub DemoProgressBar()
Dim ws As Worksheet
Dim bgBar As Shape
Dim progBar As Shape
Dim txt As Shape
Dim i As Long
Dim maxWidth As Double
Set ws = ActiveSheet
' 既存の進捗バーがあれば削除
On Error Resume Next
ws.Shapes("ProgressBG").Delete
ws.Shapes("ProgressBar").Delete
ws.Shapes("ProgressText").Delete
On Error GoTo 0
' 背景バー
Set bgBar = ws.Shapes.AddShape(msoShapeRectangle, 100, 100, 300, 30)
bgBar.Name = "ProgressBG"
bgBar.Fill.ForeColor.RGB = RGB(220, 220, 220)
bgBar.Line.ForeColor.RGB = RGB(150, 150, 150)
' 進捗バー本体
Set progBar = ws.Shapes.AddShape(msoShapeRectangle, 100, 100, 0, 30)
progBar.Name = "ProgressBar"
progBar.Fill.ForeColor.RGB = RGB(0, 176, 80)
progBar.Line.Visible = msoFalse
' 進捗率表示
Set txt = ws.Shapes.AddTextbox(msoTextOrientationHorizontal, 410, 100, 80, 30)
txt.Name = "ProgressText"
txt.TextFrame2.TextRange.Text = "0%"
txt.Line.Visible = msoFalse
txt.Fill.Visible = msoFalse
maxWidth = 300
' デモで 1%ずつ進める
For i = 1 To 100
progBar.Width = maxWidth * i / 100
txt.TextFrame2.TextRange.Text = i & "%"
DoEvents
Application.Wait Now + TimeValue("00:00:01") / 20
Next i
MsgBox "処理が完了しました。", vbInformation
End Sub
コードのポイントを解説
① 背景バーを作る
Set bgBar = ws.Shapes.AddShape(msoShapeRectangle, 100, 100, 300, 30)
まず、進捗バーの土台となる背景図形を作成しています。
横幅300、高さ30の長方形です。
② 進捗バー本体を作る
Set progBar = ws.Shapes.AddShape(msoShapeRectangle, 100, 100, 0, 30)
最初は横幅0で作成し、処理が進むにつれて横幅を広げていきます。
③ %表示を作る
txt.TextFrame2.TextRange.Text = i & "%"
進捗率を文字で見せることで、今どこまで進んだかが分かりやすくなります。
実務向け:実際の処理に組み込む例
次は、ループ処理の進行に合わせて進捗バーを更新する実践例です。
Option Explicit
Sub ProcessWithProgressBar()
Dim ws As Worksheet
Dim progBar As Shape
Dim txt As Shape
Dim bgBar As Shape
Dim i As Long
Dim total As Long
Dim maxWidth As Double
Set ws = ActiveSheet
total = 1000
' 既存削除
On Error Resume Next
ws.Shapes("ProgressBG").Delete
ws.Shapes("ProgressBar").Delete
ws.Shapes("ProgressText").Delete
On Error GoTo 0
' 作成
Set bgBar = ws.Shapes.AddShape(msoShapeRectangle, 100, 50, 300, 25)
bgBar.Name = "ProgressBG"
bgBar.Fill.ForeColor.RGB = RGB(230, 230, 230)
Set progBar = ws.Shapes.AddShape(msoShapeRectangle, 100, 50, 0, 25)
progBar.Name = "ProgressBar"
progBar.Fill.ForeColor.RGB = RGB(91, 155, 213)
progBar.Line.Visible = msoFalse
Set txt = ws.Shapes.AddTextbox(msoTextOrientationHorizontal, 410, 50, 80, 25)
txt.Name = "ProgressText"
txt.Line.Visible = msoFalse
txt.Fill.Visible = msoFalse
maxWidth = 300
For i = 1 To total
' ここに本来の処理を書く
Cells(i, 1).Value = i
' 進捗更新(毎回だと重いので10件ごとなどでもOK)
progBar.Width = maxWidth * i / total
txt.TextFrame2.TextRange.Text = Format(i / total, "0%")
If i Mod 10 = 0 Then DoEvents
Next i
MsgBox "完了しました。", vbInformation
End Sub
応用①:バーの色を変える
進捗バーの色は次の部分で変更できます。
progBar.Fill.ForeColor.RGB = RGB(255, 0, 0)
例えば、
- 緑:正常進行
- 赤:注意
- 青:標準
のように用途ごとに色分けできます。
応用②:バーをセルの上に置く
位置は Left / Top で決まるので、セル位置に合わせることも可能です。
bgBar.Left = Range("B2").Left
bgBar.Top = Range("B2").Top
これを使えば、シートのレイアウトに合わせた進捗バーを配置できます。
よくあるエラーと対処法
① 図形名が重複してエラーになる
同じ名前の図形がすでにある場合、作成時にエラーになります。
そのため、記事内コードでは最初に削除しています。
② 更新が遅い
毎回図形を更新すると重くなることがあります。
その場合は、次のように間引いて更新します。
If i Mod 10 = 0 Then
progBar.Width = maxWidth * i / total
txt.TextFrame2.TextRange.Text = Format(i / total, "0%")
DoEvents
End If
③ 処理後も図形が残る
不要であれば最後に削除することもできます。
ws.Shapes("ProgressBG").Delete
ws.Shapes("ProgressBar").Delete
ws.Shapes("ProgressText").Delete
実務での活用例
- 大量データの処理進捗表示
- CSV取込や整形マクロの進捗表示
- ファイル一括処理の進行状況表示
- ユーザー向けの「動いている感」の演出
特に、数秒〜数十秒かかる処理では、進捗バーがあるだけで安心感が大きく変わります。
まとめ
- 図形を使えば進捗バーを簡単に作れる
- Width を変えるだけで進行を表現できる
- TextBoxを使えば%表示も可能
- 大量処理マクロとの相性が非常に良い
VBAで進捗バーを作れるようになると、 単なる自動化だけでなく、使いやすいマクロが作れるようになります。
ぜひ実務でも活用してみてください。


コメント