【ExcelVBA・マクロ】図形で進捗バーを作る方法|処理の進み具合を見える化するマクロ

ExcelVBA

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で進捗バーを作れるようになると、 単なる自動化だけでなく、使いやすいマクロが作れるようになります。
ぜひ実務でも活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

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