最近Twitterで話題になっていたステータスバーを使ったコード
色々と勉強になったので備忘録としてまとめました。
結論
ステータスバーにテキストを設定するには
ApplicationオブジェクトのStatusBarプロパティを用い、
Application.StatusBar=
と記載します。
また表示方法としては
- 件数を表示するステータスバー
- ブロックが伸びるステータスバー(プログレスバー)
- ブロックが推移するステータスバー(プログレスバー)
- 現在時刻を表示するステータスバー
- (おまけ1)進捗率を表示するユーザーフォーム
- (おまけ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) 色々な表示方法
のような表示をさせることができます。
個人的には1,4のコードはシンプルなのでマクロが止まっていないかの確認に使えそうです。
個人的な備忘録ですが参考にしていただければ幸いです。
VBAでのファイル操作にFileSystemObjectを使ってみませんか?初心者からでも可能なまとめ記事としていますので参考にしていただければ幸いです。
コメント