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 ET_MsgBox

さきほどのプログラムと比較すると、「ET.init AutoPrintOption:=ET_MsgBox」を最後に付け加えているだけで、後はまったく同じです。
こうすると、プログラム実行終了までの時間がメッセーボックスに表示されます。

たとえば、次のように、マクロの先頭に上記2行を入れることで、マクロ開始時~終了時までの実行時間がメッセージボックスに表示されます。

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の「クラスモジュール」という仕組みを使っています。

今回のクラスモジュールには、次のような特徴があります。

  1. 「Set ET = New ElapsedTime」を実行した時点で、クラスモジュールの中の「Class_initialize」が実行される
  2. プログラムの実行が終わった時点で、クラスモジュールの中の「Class_Terminate」が実行される

特に、この「Class_Terminate」がプログラム終了時に自動実行される性質が重要です。

この性質を使って、経過時間を自動表示させています。

ダウンロード

エクセルブック(.xlsm形式)

デモ用のマクロが入っています。
実際の動きを手軽に試したい方は、こちらをお使いください。
ElapsedTimeSample.xlsm

ソースファイル(.cls形式)

あなたのマクロに、時間計測機能を付け加えたい場合には、こちらをお使いください。
ElapsedTime.cls

※インストール方法は、基本的な使い方(イミディエイトウィンドウにマクロの実行時間を出力する)をご覧ください。

エクセル基礎講座 「無料」動画マニュアル

「経理事務のためのエクセル基礎講座(初級編)」(動画マニュアル 総収録時間162分)を無料プレゼント中です!

このマニュアルで解説していることを一通り学べば、経理事務を行う上で最低限必要となる知識が得られます。

ご登録者の方には、合わせて、公認会計士が実体験を通して身に付けたエクセルを使う技をメールにてお伝えしていきます!

無料動画講座 登録フォーム

※ご登録頂いたメールアドレスに、エクセルを使いこなすための情報を配信するメールセミナー「エクセル倍速講座」も合わせて配信させていただきます。