Excel VBA 時間のかかるマクロの進捗状況を表示する

スポンサーリンク

時間のかかるマクロの進捗状況を表示する方法

数万回の繰り返し処理などで時間のかかるマクロの進捗状況を表示したい場合に、手軽に利用できる方法は「ステータスバー」に進捗状況を表示する方法です。

「ステータスバー」には、任意の文字を表示することができるので、進捗状況のパーセントを表示したり「■」と「□」を利用して棒グラフを表示することもできますが、画面の左下スミなので、視覚性が良くないのが欠点です。

そこで、手間はかかりますが、ユーザーフォームの「プログレスバー」を利用する方法もご紹介します。

ステータスバーにマクロの進捗状況を表示する方法

今回は3万回の繰り返し処理の中で進捗状況を「ステータスバー」に棒グラフのように表示するコードをご紹介します。

実行イメージ


ステータスバーにマクロの進捗状況を表示するコードと解説

このコードは「ステータスバー」を表示するために作成したコードなので、実際使用する際は4行目のコードを繰り返し処理の中に6行目、7行目のコードを繰り返し処理が終わった直後に記述してください。

Sub ステータス表示()
Dim i As Long
For i = 1 To 30000
Application.StatusBar = "実行中..." & Left(String(Int(i / 30000 * 10), "■") & String(10, "□"), 10)
Next i
Application.StatusBar = False
MsgBox "処理が終了しました。"
End Sub

4行目【 Application.StatusBar = “実行中…” & Left(String(Int(i / 30000 * 10), “■”) & String(10, “□”), 10) 】Application【アプリケーション】オブジェクトのStatusBar【ステータスバー】プロパティに表示する文字列を代入します。「□」を10個分用意して、その前で「■」の個数を変化させることにより、棒グラフが伸びるように表現しました。ここでは、Left【レフト】関数、String【ストリング】関数、Int【イント】関数が使用します。それぞれの関数を簡単に説明します。

  • Left【レフト】関数
    文字列の左から文字数分の文字列を抜き出す関数です。
    書式はLeft(文字列,文字数)
  • String【ストリング】関数
    指定した文字を指定数表示する関数です。
    書式はString(表示する数,表示する文字)
  • Int【イント】関数
    引数に入れた数値または数式の小数点以下を除いた整数を返す関数です。
    書式はInt(小数点型数値または数式)

【 Left(String(Int(i / 30000 * 10), “■”) & String(10, “□”), 10) 】
まずは、Left関数の引数から見ていきます。Int関数で変数(i÷30000×10個)で繰り返し処理の進捗割合を計算して整数にします。String関数で「■」を繰り返しの進捗割合の数表示する設定にします。ここでの計算は例えば繰り返し回数のカウンタ―変数(i)が最後の繰り返し30000だった場合(30000÷30000*10)で10になります。29999回だった場合は
(29999÷30000*10)で9.999・・となりますが、Int関数は整数部分だけ返す関数なので9となります。

次のString関数では「□」を10個表示する設定にして「&」(アンパサンド)で連結しています。
繰り返し回数が増える毎に、「■」の数が増えていき10個表示されている「□」が右にズレていきます。それをLeft関数で表示を左から10文字に指定しているので「□」が「■」に変化しているように見えるわけです。


6行目【 Application.StatusBar = False 】
Application【アプロケーション】オブジェクトのStatusBar【ステータスバー】プロパティにFalse【フォールス】を設定してステータスバーの表示を非表示にします。


7行目【 MsgBox “処理が終了しました。” 】
MsgBox関数を使用して処理が終了したことを伝えます。

プログレスバーでマクロの進捗状況を表示する方法

「ステータスバー」の解説と同じ3万回の繰り返し処理の進捗状況をユーザーフォームに「プログレスバー」で進捗状況を表示する方法について解説します。

実行イメージ


まずは、「ユーザーフォーム」を作成します。

ユーザーフォームの作成手順

1.開発タブをクリックしてVisualBasicボタンをクリックします。


2.挿入タブをクリックして、リストの中から「ユーザーフォーム」を選択します。



3.ユーザーフォームのツールボックスには、標準で「プログレスバー」はないので、ツールボックスの空きスペースをマウス右ボタンでクリックして「その他のコントロール」をクリックします。



4.「その他のコントロール」から「プログレスバー」を選択します。



5.ツールボックスに「プログレスバー」が表示されました。



6.ユーザーフォームを作成していきます。ツールボックスから「ラベル」を選択します。



7.ユーザーフォームに「ラベル」をおいて、プロパティを操作します。



8.同じように、進捗のパーセントを表示する「ラベル」を作成します。
オブジェクト名を「パーセント」にします。



9.「プログレスバー」をユーザーフォームに設置します。



10.「ユーザーフォーム」のプロパティでオブジェクト名を「info」に変更します。



これで、進捗状況を表示するユーザーフォームが作成できました。次に、コードについての解説をします。コードはユーザーフォームに記述するコードと標準モジュールに記述するコードの2種類が必要になります。

まずは、ユーザーフォームに記述するコードについて解説します。

ユーザーフォームに記述するコードと解説

Private Sub UserForm_Initialize()
With ProgressBar1
    .Min = 0
    .Max = 30000
    .Value = 0
End With
パーセント.Caption = ""
End Sub
1行目【Private Sub UserForm_Initialize()】
UserForm_Initialize【ユーザーフォームイニシャライズ】プロシージャ内にコードを記述します。
1.VBEのプロパティウインドウからユーザーフォームを選択しマウス右クリックで「コードを表示」を選択します。



2.ダウンリストの中から「UserForm」を選択します。



3.右のダウンリストから「Initialize」を選択します。
してコードを記述します。



2行目【 With ProgressBar1 】
With【ウィズ】ステートメントで 「ProgressBar1」【プログレスバー1】を指定します。


3行目【 .Min = 0 】
With【ウィズ】ステートメントで指定したProgressBar1【プログレスバー1】の最小値を設定するMin【ミニ】プロパティに0に設定します。


4行目【 .Max = 30000 】
With【ウィズ】ステートメントで指定したProgressBar1【プログレスバー1】の最大値を設定するMax【マックス】プロパティに30000に設定します。


5行目【 .Value = 0 】
With【ウィズ】ステートメントで指定したProgressBar1【プログレスバー1】の初期の表示値を設定するValue【バリュー】プロパティに0を設定します。


7行目【 パーセント.Caption = “” 】

進捗のパーセントを表示するLabel【ラベル】オブジェクトの「パーセント」の表示する文字を表すCaption【キャプション】プロパティに「長さ0文字の文字列」を指定して、空白を表示します。

標準モジュールに記述するコードと解説

Sub info表示()
Dim i As Long
info.Show vbModeless
For i = 1 To 30000
With info
     .ProgressBar1.Value = i
     .パーセント.Caption = Int(i / 30000 * 100) & "%"
     .Repaint
End With
Next i
info.Hide
MsgBox "処理が終了しました。"
Unload info
End Sub
3行目【 info.Show vbModeless 】
繰り返し処理の前に「info」(ユーザーフォーム)をShow【ショー】メソッドでモードレスで表示させます。


6行目【 .ProgressBar1.Value = i 】
With【ウィズ】ステートメントで指定したユーザーフォームオブジェクトのProgressBar1【プログラスバー1】オブジェクトのValue【バリュー】プロパティにカウンター変数「i」を設定して
値を増加させていきます。


7行目【 .パーセント.Caption = Int(i / 30000 * 100) & “%” 】
With【ウィズ】ステートメントで指定したユーザーフォームオブジェクトのLabel【ラベル】オブジェクトの「パーセント」の表示を表すCaption【キャプション】プロパティに進捗の割合を表示します。


8行目【 .Repaint 】
ユーザーフォームオブジェクトのRepaint【リパイント】メソッドを使用してユーザーフォームに画面の更新がある場合に画面の再描画を実行します。ここまでを繰り返し処理の中に記述します。


11行目【 info.Hide 】
繰り返し処理の直後にHide【ヒデン】メソッドを使用して一旦、ユーザーフォームの表示を非表示にします。


12行目【 MsgBox “処理が終了しました。” 】
MsgBox【メッセージブックス】関数を使用して、ユーザーに処理が終わったことを伝えます。


13行目【 Unload info 】
ユーザーフォームを閉じます。

以上で、時間のかかるマクロの進捗状況を表示する方法の解説を終了します。
ありがとうございました。

スポンサーリンク

関連記事・広告