VBAの処理進捗を表示して待ち時間を知らせる4つの方法

エクセルのマクロが重い(遅い)とき、VBAコードを見直して軽くする(速くする)ことが第一ですが、それでも時間がかかる処理ってあるんじゃないでしょうか。

そんなケースでは、処理があとどれくらいかかるのかなって気になりますよね。

ここで使えるのがステータスバーです。

この記事では「マクロの処理進捗をステータスバーに表示して待ち時間を知らせる方法」について解説します。

VBAコードの見直しについては別記事の『エクセルのマクロが重い原因を探して劇的に軽くする3つの方法』を御覧ください。

1. ステータスバーとは

こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。

まずはステータスバーについて解説します。

ステータスバーとはエクセルの最下部にあるバーのことです。

左にはセルモード(準備完了など)、右には表示選択ショートカットやズームスライダー、ズームが表示されているかと思います。

今回はこのステータスバーの左部分にマクロの処理進捗を表示していきたいと思います。

ステータスバー

2. ステータスバーへの表示方法

ステータスバーへの表示方法から見ていきます。

ステータスバーへなにかを表示する際、VBAで以下のように記載します。

Application.StatusBar = “進捗を表示します”

この記載で、ステータスバーの左部分には『進捗を表示します』という文字列を表示できるのです。

もうひとつ大事なのが、ステータスバーの開放です。

マクロの実行中だけ進捗を表示して、その処理が終わったときに通常のセルモードを表示させる必要がありますので、VBAコードの最後に以下の記載を忘れないようにしましょう。

Application.StatusBar = False

3. ベースとするサンプルのVBAコード

マクロの処理進捗を表示させたい=待ち時間を知りたいというケースでは、主に繰返し処理に時間が割かれているかと思います。

したがって、この記事では以下のようなVBAコードをサンプルとしたいと思います。

このサンプルはわざと時間のかかるような繰返し処理をさせているものです。処理を速くする方法については別記事で解説していますので、そちらを参考にしてください。

Sub 重いマクロ()
Dim st, ft, t As String
Dim i As Long
 Range("A:A").ClearContents
 For i = 1 To 10000
  Cells(i, 1).Select
  ActiveCell.Value = i ^ 2
 Next i</p>
End Sub

4. 待ち時間を知らせるVBAコード

4.1 処理回数の表示

待ち時間を知らせるのにもっともシンプルなのは、処理進捗として繰り返しの処理回数を表示させることです。

以下のVBAコードでは、【A】部分で10000回の繰り返しのうち何回目の処理を行っているかを表示させています。

Sub 重いマクロの進捗表示1()
Dim st, ft, t As String
Dim i As Long

 Range("A:A").ClearContents

 For i = 1 To 10000
  Cells(i, 1).Select
  ActiveCell.Value = i ^ 2
'【A】処理回数の表示
  Application.StatusBar = "10000回中" &amp; i &amp; "回目の処理"
 Next i
'【B】ステータスバーの開放
 Application.StatusBar = False

End Sub
処理回数

4.2 プログレスバー的な表示

処理進捗として、■と□を使ったプログレスバー的な表示をさせてみます。

以下のVBAコードでは、【A】部分で1000回繰り返すごとに進捗を計算して■(処理済)と□(処理前)の個数を決めて表示させています。

ここで、1000回ごとにというのはMod演算子を用いました。『i mod 1000 = 0』というのがi(繰返し回数)が1000で割り切れる=余りが0のときを示しています。

また、■や□の表示には『String( 個数,”文字列” )』を使用しています。

Sub 重いマクロの進捗表示2()
Dim st, ft, t As String
Dim i As Long

Range("A:A").ClearContents

For i = 1 To 10000
Cells(i, 1).Select
ActiveCell.Value = i ^ 2
'【A】プログレスバー的表示
If i Mod 1000 = 0 Then
Application.StatusBar = "進捗" &amp; String(Int(i / 10000 * 5), "■") &amp; String(5 - Int(i / 10000 * 5), "□")
End If
Next i
'【B】ステータスバーの開放
Application.StatusBar = False

End Sub
プログレスバー

4.3 パーセントの表示

処理進捗として、パーセント表示をさせたのが、以下のVBAコードになります。

(2)と同様、1000回繰り返すごとにパーセント表示をさせていますので、10%刻みの表示となっています。

Sub 重いマクロの進捗表示3()
Dim st, ft, t As String
Dim i As Long

Range("A:A").ClearContents

For i = 1 To 10000
Cells(i, 1).Select
ActiveCell.Value = i ^ 2
'【A】パーセント表示
If i Mod 1000 = 0 Then
Application.StatusBar = "進捗" &amp; Int(i / 10000 * 100) &amp; "%"
End If
Next i
'【B】ステータスバーの開放
Application.StatusBar = False

End Sub
パーセント

4.4 残り時間の表示

最後に紹介するのは残り時間を推定して表示させる方法です。

以下のVBAコードでは、【A】部分で開始時刻stを記録します。【B】部分では1000回ごとに処理時刻ftを記録し、ft、stの差・処理回数i、繰返し回数(10000回)を使って処理完了の時間を推定しています。推定した時間と処理にかかっている時間との差を、残り時間として表示させます。

Sub 重いマクロの進捗表示4()
Dim st, ft, t As String
Dim i As Long

'【A】開始時刻の記録
st = Timer

Range("A:A").ClearContents

For i = 1 To 10000
Cells(i, 1).Select
ActiveCell.Value = i ^ 2
'【B】残り時間表示
If i Mod 1000 = 0 Then
ft = Timer
Application.StatusBar = "残り時間約" &amp; Int((ft - st) / i * 10000) - Int((ft - st)) &amp; "sec"
End If
Next i
'【C】ステータスバーの開放
Application.StatusBar = False

End Sub
残り時間

5. まとめ

この記事では「マクロの処理進捗をステータスバーに表示して待ち時間を知らせる方法」について解説しましたが、いかがでしたか?

今回は単純な繰返し処理だけの処理進捗を考えてみましたが、複雑な処理をさせる場合にも応用が効くと思います。

自分で利用する場合はもちろん、他の方を共有するマクロでも活躍しますので、ぜひ導入してみてくださいね。