【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の”便利”を使って、業務効率化をご提供します!