スポンサーリンク

【Excel VBA】進捗率を見える化してくれる!ステータスバーに進捗状況やプログレスバーを追加する

VBAでの操作

最近Twitterで話題になっていたステータスバーを使ったコード

色々と勉強になったので備忘録としてまとめました。

スポンサーリンク

結論

ステータスバーにテキストを設定するには

ApplicationオブジェクトのStatusBarプロパティを用い、

Application.StatusBar=

と記載します。

また表示方法としては

  1. 件数を表示するステータスバー
  2. ブロックが伸びるステータスバー(プログレスバー)
  3. ブロックが推移するステータスバー(プログレスバー)
  4. 現在時刻を表示するステータスバー
  5. (おまけ1)進捗率を表示するユーザーフォーム
  6. (おまけ2)色々な表示方法

などがあります。

詳しくは次から説明します。

ステータスバー、プログレスバーとは

ステータスバーとはExcelの表示領域の一番下に表示されている部分のことです。

クリックすると拡大します

プログレスバーとは処理や作業の進捗状況を棒状の領域の内部の色の変化によって表示するものです。
ダウンロードや起動の際にもよく表示されます。

今回はこのステータスバーに進捗状況の数値やプログレスバーを表示させるようにします。
ステータスバーのテキストを取得したり設定する場合に、ApplicationのStatusBarプロパティを使います。
Application.StatusBar プロパティ(Docs)

1. 件数を表示するステータスバー

@toshi81350036さん紹介のコードです。

サンプルと動画は以下になります。

Sub StatusBar1()

  Dim i As Long
  Dim max件数 As Long
      
  max件数 = 10000
  
  For i = 1 To max件数
    If i Mod 10 = 0 Then
      Application.StatusBar = i & "件完了/" & max件数 & "件中"
      DoEvents
    End If
  Next
  
  Application.StatusBar = False

End Sub

ループ処理の間にApplication.StatusBarを入れ込んで=以降で表示させたい内容を記載しています。

なお、そのまま表示させると重くなるのでi Mod 10=0で10で割り切れる数字のみ表示させています

2. ブロック(■)が伸びるステータスバー(プログレスバー)

次は@m_wataridoriさん紹介のコードです。

サンプルと動画は以下になります。

Sub StatusBar2()
  
  Dim i As Long
  Dim iComp As Long
  Dim iRest As Long
  Dim sStatus As String
  Dim max件数 As Long
  
  max件数 = 10000
  
  For i = 1 To max件数
    iComp = i / max件数 * 10
    iRest = 10 - iComp
    sStatus = ""
    sStatus = sStatus & String(iComp, "■")
    sStatus = sStatus & String(iRest, "□")
    Excel.Application.StatusBar = sStatus
    DoEvents
  Next
  
  Application.StatusBar = False

End Sub

途中のString関数はString(数値,文字)であらわされ、数値分の文字を記載します。

割合を0~10としてゲージのように表示させているのが秀逸です。

3. ブロック(■)が推移するステータスバー(プログレスバー)

こちらも@m_wataridoriさん紹介のコードです。

サンプルと動画は以下になります。

Sub StatusBar3()
  
  Dim i As Long
  Dim iComp As Long
  Dim iRest As Long
  Dim sStatus As String
  Dim max件数 As Long
  
  max件数 = 10000
  
  For i = 1 To max件数
    iComp = (i / max件数) * 10
    sStatus = ""
    sStatus = sStatus & String(iComp, "―")
    sStatus = sStatus & "■"
    sStatus = sStatus & String(9 - iComp, "―")
    Excel.Application.StatusBar = sStatus
    DoEvents
  Next
  
  Application.StatusBar = False

End Sub

先ほどのものと似ていますが、「処理した割合(―)+ブロック(■)+処理していない割合(―)」で表示しているのが秀逸です。

4. 現在時刻を表示するステータスバー

こちらは@kazuyaarai_mosiさん紹介のコードです。

サンプルと動画は以下になります。

Sub StatusBar4()
  
  Dim i As Long
  Dim max件数 As Long
      
  max件数 = 100000
  
  For i = 1 To max件数
      Application.StatusBar = Format(Now(), "hh:nn:ss")
  Next
  
  Application.StatusBar = False
  
End Sub

ステータスバーに現在時刻を表示させたもので、処理が止まっていないかを確認するのに使えます。

これだとカウントに依存しないシンプルなコードを書くことができます。

見るべきものを「実行中のマクロの時間」としたところが秀逸ですね。

5. (おまけ)進捗率を表示するユーザーフォーム

ステータスバーとは異なりますがこちらも @toshi81350036さん紹介のコードです。

これまでのApplication.StatusBarとは異なりますが、ユーザーフォームを使っても表示させることができます。

サンプルと動画は以下になります。

Sub StatusBar5()
  
  Dim max件数 As Long
  Dim i As Long
  
  max件数 = 1000000
  
  UserForm1.Show vbModeless
  UserForm1.Caption = "〇〇を処理しています..."
   
  For i = 1 To max件数
    If i Mod 10 = 0 Then
      UserForm1.Label1.Caption = Int(i / max件数 * 100) & "%"
      DoEvents
    End If
  Next
  
  Unload UserForm1
  
End Sub

ユーザーフォームの追加はざっくりとですが以下のようになります。

クリックすると拡大します

としじさんも言われていましたがステータスバーに比べてユーザーフォームで作ったもののほうが処理は非常に速いです(コード中のmax件数が2桁違う)。ステータスバーは処理にコストがかかる(としじさん談)んですね。

6. おまけ2

ステータスバーについては以下のサイトにもいろいろと書かれていました。

Office Tanakaさんのサイト 今回の内容に加えステータスバーの基本的な使い方も書いてくださっています。

My Recordさんのサイト。ユーザーフォームを使ってゲージのように表示させることもできるようです。

@blacklist_ryuさんのTwitter

画像貼り付けをやったことはないのですが、別のシートに画像を仕込んでおくのでしょうか(ローカルだと人に渡せない)・・・。
音楽まで入れるなど使いこなされてます。

まとめ

ステータスバーはApplication.StatusBar=にて簡単に利用することができ、

  1. 件数を表示するステータスバー
  2. ブロックが伸びるステータスバー
  3. ブロックが推移するステータスバー
  4. 現在時刻を表示するステータスバー
  5. (おまけ1)進捗率を表示するユーザーフォーム
  6. (おまけ2) 色々な表示方法

のような表示をさせることができます。

個人的には1,4のコードはシンプルなのでマクロが止まっていないかの確認に使えそうです。

個人的な備忘録ですが参考にしていただければ幸いです。

VBAでのファイル操作にFileSystemObjectを使ってみませんか?初心者からでも可能なまとめ記事としていますので参考にしていただければ幸いです。

コメント

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