【Excel/VBA】ステータスバーを自作する方法

みなさんこんにちは。

VBAで大量の処理をするときに時間が掛かり、

その間PC操作ができないとなると、手持ち無沙汰になりがちです。

実際、現場では処理に時間のかかるマクロを実行する場合、
進捗が見えず長時間経過するとユーザーは不安になるため
現在の状況をユーザーに提示すると良いかと思います。

マクロの実行中にユーザーへメッセージを伝える方法はいくつかありますが、
今回はもっとも簡単な方法のひとつとしてステータスバーを使う方法をご紹介します。

過去のブログではプログレスバーを自作する方法について紹介しております。

そちらもぜひご参考ください。

この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • VBAプログラミング:初級者~中級者
  • 自動化処理を見える化したい人
  • コードだけサクッと取得したい人

プログレスバーを使用するメリット

プログレスバーを使用するメリットは以下のとおりです。

  • ユーザーが処理を中断しなくなる(動作の見える化)
  • 進捗状況の見える化
  • 終了時間が推測可能

手順

ボタンを用意する

「開発」リボン→「挿入」→「ボタン」を選択します。

マクロ名を編集し(仮に”testfunction”とします)、「新規作成」ボタンをクリックします。

コードを書く

ボタンをクリックしたときの処理を以下のようにします。

' ボタンクリック時の処理
Sub testfunction()

' ステータスバー表示
Call StatusBar

End Sub

StatusBar関数の内容を以下のようにします。

' ステータスバー表示
Sub StatusBar()
    '定数
    Const indexStart = 0
    Const indexEnd = 100

    '進捗率
    Dim percent As Long
    percent = -1

    For i = indexStart To indexEnd
    
        '1ミリ秒待機する処理
        Application.Wait [Now() + "0:00:00.1"]
        
        '進捗率
        percent = Application.WorksheetFunction.RoundDown(i / indexEnd * 100, 0)
        
        'ステータスバー設定
        Call UpdateStatusBar(percent)
    
    Next

    'ステータスバー初期化
    Application.StatusBar = False
End Sub

UpdateStatusBar関数の内容を以下のようにします。

‘ ステータスバーを更新する
Sub UpdateStatusBar(percent As Long)
Dim progress As String
Dim i As Long
Dim compStatus As Long
Dim noStatus As Long

' 進捗率に基づいて「■」の数を計算
compStatus = percent \ 10
noStatus = 10 - compStatus

' 「■」と「・」を組み合わせて進捗を表示
progress = String(compStatus, "■") & String(noStatus, "・")

' ステータスバーに進捗を設定
Application.StatusBar = progress & "進捗(" & percent & "%)を処理中…"

End Sub

コードの内容をざっくりと

設置したボタンをクリックすると以下のような内容になります。

・Excelの左下のステータスバーに進捗が表示される。
・最初は”・・・・・・・・・・”と表示される。
・進捗10%毎に”・”が”■”に変化する

コード全体の記述(完成形)

コード全体では以下の通りとなります。

'/////////////////////////////////////////////
'  ボタンクリック時の処理
'/////////////////////////////////////////////
Sub testfunction()
    
    ' ステータスバー表示
    Call StatusBar

End Sub

'/////////////////////////////////////////////
' ステータスバー表示
'/////////////////////////////////////////////
Sub StatusBar()
    '定数
    Const indexStart = 0
    Const indexEnd = 100

    '進捗率
    Dim percent As Long
    percent = -1

    For i = indexStart To indexEnd
    
        '1ミリ秒待機する処理
        Application.Wait [Now() + "0:00:00.1"]
        
        '進捗率
        percent = Application.WorksheetFunction.RoundDown(i / indexEnd * 100, 0)
        
        'ステータスバー設定
        Call UpdateStatusBar(percent)
    Next

    'ステータスバー初期化
    Application.StatusBar = False
End Sub

'/////////////////////////////////////////////
' ステータスバーを更新する
'/////////////////////////////////////////////
Sub UpdateStatusBar(percent As Long)
    Dim progress As String
    Dim i As Long
    Dim compStatus As Long
    Dim noStatus As Long
    
    ' 進捗率に基づいて「■」の数を計算
    compStatus = percent \ 10
    noStatus = 10 - compStatus
    
    ' 「■」と「・」を組み合わせて進捗を表示
    progress = String(compStatus, "■") & String(noStatus, "・")
    
    ' ステータスバーに進捗を設定
    Application.StatusBar = progress & "進捗(" & percent & "%)を処理中…"
End Sub

最後に

いかがでしたでしょうか。

進捗が可視化されると長時間稼働するマクロを実行しても、
処理経過が確認できるためユーザーにも優しくなりますね。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、依頼したり、何か聞きたいことがあったりしたら

いつでもお気軽にご相談ください。

また、内容についてご不明点があればメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

業務効率化(RPA)ツールを開発します Excelの”便利”を使って、業務効率化をご提供します!

ご興味がある方はこちら!!