VBAの処理時間を計測する汎用プログラムを公開します
最近、よく、VBAで処理時間を計測しています。
ただ、毎回、ソースコードに処理時間計測ロジックを書くのが面倒になったので、ソースコードをコピペするだけで使い回せる「処理時間計測プログラム」を作りました。
この記事の目次
デモ
次のURLからエクセルブックをダウンロードしてください
→ElapsedTimeSample.xlsm のダウンロードはこちら
エクセルブックを開き、Ctrl+Shift+Z、または、Ctrl+Shift+Yを押すと、A1セル~A100セルの数値を並べ替えるマクロを実行するとともに、その実行時間を計測・表示します。
- Ctrl+Shift+Z
-
Visual Basic Editorのイミディエイトウィンドウに実行時間が表示されます
- Ctrl+Shift+Y
-
メッセージボックスに実行時間が表示されます
基本的な使い方(イミディエイトウィンドウにマクロの実行時間を出力する)
自分で作ったマクロの実行時間を計測したい場合には、以下のようにします。
- 実行時間を計測したいマクロが入っているエクセルブックに、クラスモジュールをインストール
- 必要な命令を追記
クラスモジュールのインストール
- 1.ソースコードを手元のPCに保存する
-
次のURLからソースコードを手元のPCに保存してください。
→ElapsedTime.cls のダウンロードはこちら - 2.エクスプローラーからVisual Basic Editorにコピペ
-
Visual Basic Editorを開き、ファイルをコピペします。
これで、クラスモジュールのインストールは完了です。

ソースコードに追記する
クラスモジュールをインストールした後、計測を開始したい場所に、次のソースコードを挿入します。
Dim ET As ElapsedTime
Set ET = New ElapsedTime
これだけで、プログラム実行終了までの時間がイミディエイトウィンドウに表示されます。
たとえば、次のように、マクロの先頭に上記2行を入れるだけで、マクロ開始時~終了時までの実行時間がイミディエイトウィンドウに表示されます。
Sub イミディエイトウィンドウに時間を表示()
'先ほどの2行を転記。計測開始
Dim ET As ElapsedTime
Set ET = New ElapsedTime
'実行ロジック
...
End Sub
計測終了したい場所にソースコードを挿入する必要はありません。

その他の使い方
今回のクラスには、いくつかの機能が組み込まれています。
呼び出し方を少し変えることで、それらの機能を使うことができます。
メッセージボックスにマクロの実行時間を表示する
先ほどの2行の後に「ET.init」を呼び出す行を付け加えることで、メッセージボックスに実行時間を表示させることができます。
Dim ET As ElapsedTime
Set ET = New ElapsedTime
ET.init AutoPrintOption:=ET_MsgBox
さきほどのプログラムと比較すると、「ET.init AutoPrintOption:=ET_MsgBox」を最後に付け加えているだけで、後はまったく同じです。
こうすると、プログラム実行終了までの時間がメッセージボックスに表示されます。
たとえば、次のように、マクロの先頭に3行追加すれば、マクロ開始時~終了時までの実行時間がメッセージボックスに表示されます。
Sub メッセージボックスに時間を表示()
'先ほどの3行を転記。計測開始
Dim ET As ElapsedTime
Set ET = New ElapsedTime
ET.init AutoPrintOption:=ET_MsgBox
'実行ロジック
...
End Sub

時刻出力形式の変更
「ET.init」の引数をかえると、実行時間の出力形式を変更することもできます。
Dim ET As ElapsedTime
Set ET = New ElapsedTime
ET.init TimeFormat:="0.00"
たとえば、次のように、マクロの先頭に上記3行を入れることで、実行時間が100分の1秒単位でイミディエイトウィンドウに表示されます。
Sub イミディエイトウィンドウに時間を表示()
'先ほどの3行を転記。計測開始
Dim ET As ElapsedTime
Set ET = New ElapsedTime
ET.init TimeFormat:="0.00"
'実行ロジック
...
End Sub
プログラムの途中までの実行時間を測定する
プログラムの途中までの実行時間を測定するためには、手動で実行時間を表示させます。
まず、「ET.init AutoPrintOption:=ET_None」と指定することで、実行時間の自動表示が行われなくなります。
あとは、実行時間を表示したい箇所で「ET.getFormattedElapsedTime」により「実行時間」を取得できます。
適宜、「Debug.Print」などを使って、実行時間を表示してください。
Sub ロジックごとに時間を表示()
...
'計測開始
Dim ET As ElapsedTime
Set ET = New ElapsedTime
ET.init AutoPrintOption:=ET_None
'時間を計りたいロジック1
...
'時間を計りたいロジック1の実行時間表示
Debug.Print "実行時間:" & ET.getFormattedElapsedTime & "秒"
'時間を計りたいロジック2
...
'時間を計りたいロジック2の実行時間表示
Debug.Print "実行時間:" & ET.getFormattedElapsedTime & "秒"
End Sub
「ET.getFormattedElapsedTime」を複数回使った場合には、次の「経過時間」を取得できます。
- 2回目の「ET.getFormattedElapsedTime」では、1回目の「ET.getFormattedElapsedTime」以降の経過時間
- 3回目の「ET.getFormattedElapsedTime」では、2回目の「ET.getFormattedElapsedTime」以降の経過時間
- ・・・
ElapsedTimeクラスのソースコード
Public Enum ET_AutoPrintOption
ET_None = 0
ET_DebugPrint = 1
ET_MsgBox = 2
End Enum
'プログラム終了時に自動で経過時間を出力するかどうかの制御用
Private c_AutoPrintOption As ET_AutoPrintOption
'上記出力時のフォーマットを取得
Private c_TimeFormat As String
'計測開始時点の時刻
Private startTime As Double
Private Sub Class_initialize()
Call init
End Sub
Private Sub Class_Terminate()
Dim Str As String
Str = "実行時間は" & getFormattedElapsedTime & "秒です"
If c_AutoPrintOption = ET_DebugPrint Then
Debug.Print Str
ElseIf c_AutoPrintOption = ET_MsgBox Then
MsgBox Str
End If
End Sub
Public Sub init(Optional AutoPrintOption As ET_AutoPrintOption = ET_DebugPrint, Optional TimeFormat As String = "0.0000")
c_AutoPrintOption = AutoPrintOption
c_TimeFormat = TimeFormat
Call reset
End Sub
Public Sub reset()
startTime = Timer
End Sub
Public Function getElapsedTime(Optional resetTimer As Boolean = True) As Double
getElapsedTime = Timer - startTime
If resetTimer Then
Call reset
End If
End Function
Public Function getFormattedElapsedTime(Optional resetTimer As Boolean = True) As String
getFormattedElapsedTime = Format(getElapsedTime(resetTimer), c_TimeFormat)
End Function
プログラムの簡単な解説
今回の時間測定プログラムは、VBAの「クラスモジュール」という仕組みを使っています。
今回のクラスモジュールには、次のような特徴があります。
- 「Set ET = New ElapsedTime」を実行した時点で、クラスモジュールの中の「Class_initialize」が実行される
- プログラムの実行が終わった時点で、クラスモジュールの中の「Class_Terminate」が実行される
特に、この「Class_Terminate」がプログラム終了時に自動実行される性質が重要です。
この性質を使って、経過時間を自動表示させています。
ダウンロード
- エクセルブック(.xlsm形式)
-
デモ用のマクロが入っています。
実際の動きを手軽に試したい方は、こちらをお使いください。
→ElapsedTimeSample.xlsm - ソースファイル(.cls形式)
-
あなたのマクロに、時間計測機能を付け加えたい場合には、こちらをお使いください。
→ElapsedTime.cls※インストール方法は、基本的な使い方(イミディエイトウィンドウにマクロの実行時間を出力する)をご覧ください。