【VBA】時間を計測して、結果を表示する(3つの方法)

せっかく作業を効率化させる為に自動化するのですから、より短い時間で動作するコードを書きたいものです。
自分の書いたコードが、どの位の速度で動いているのか、気になりますよね。そういった場合に、時間を計測してくれるコードが便利です。
計測の結果は、表示のさせ方に、3つの方法があります。

  1. メッセージボックスに表示する
  2. イミディエイトウィンドウに表示させる
  3. セルに書き出す

それぞれのフォーマットと、使い所を書いて行きます。

メッセージボックスに表示する

テストする場合や、とりあえず単機能を作ってみる時などに、時間計測付きのプロシージャをよく使います。
しかし、計測結果をセルやイミディエイトウィンドウに書き出す場合は問題ないのですが、計測結果をメッセージボックスで表示させる場合は、使い所に気を付けた方が良いでしょう。
ちょっと整理してみます。

コード

まずは、時間計測の結果を、メッセージボックスで表示させるプロシージャです。

Sub セルA1からA10に1を入力()

  '時間を計測・・・計測開始
  Dim StartTime, StopTime As Variant
  StartTime = Time

  'ここは好きなコードを書く
  Dim i as Integer
  For i = 1 To 10
    Cells(i, 1).Value = 1
  Next i

  '時間を計測・・・計測結果を表示
  StopTime = Time
  StopTime = StopTime - StartTime
  MsgBox "完了" & vbCrLf & vbCrLf & "所要時間:" & Minute(StopTime) & "分 " & Second(StopTime) & "秒"

  'セルA1を選択
  Range("A1").Select

End Sub

使い所:Call で呼び出すプロシージャには使わない

コードが長くなる際、小さな機能を「単機能」として作り、その「単機能」を 、Call でまとめて呼び出す方法をよく使います。
その際、「単機能」のプロシージャには、時間計測のコードは使いません。
なぜなら、Call で呼び出された「単機能」が終了する度に、時間の計測結果(メッセージボックス)が表示され、「OK」を押すまでプログラムが止まってしまうからです。
※もちろん意図的にやる場合もあります。例:今どこまで動いたかを把握する為など。

ですので、
・呼ぶ側(Call で「単機能」を呼び出す):時間計測付きプロシージャ
・呼ばれる側(「単機能」):時間計測は使わない
といった使い方をしています。

Sub Callで呼び出して機能をまとめる()
   'Callで呼び出して機能をまとめる

  '時間を計測・・・計測開始
  Dim StartTime, StopTime As Variant
  StartTime = Time

  Call セルA1からA10に1を入力
  Call セルA1からA10に1を加算

  '時間を計測・・・計測結果を表示
  StopTime = Time
  StopTime = StopTime - StartTime
  MsgBox "完了" & vbCrLf & vbCrLf & "所要時間:" & Minute(StopTime) & "分 " & Second(StopTime) & "秒"

  'セルA1を選択
  Range("A1").Select

End Sub
Sub セルA1からA10に1を入力()
   'Callで呼び出される機能

  Dim i as Integer
  For i = 1 To 10
    Cells(i, 1).Value = 1
  Next i

End Sub
Sub セルA1からA10に1を加算()
   'Callで呼び出される機能

  Dim i as Integer
  For i = 1 To 10
    Cells(i, 1).Value = Cells(i, 1).Value + 1
  Next i

End Sub

マクロ終了時に、どの位の時間で完了したか分かる点が良いところ。
特に依頼されて作った時、このように表示する事で、
「今まで15分は掛かっていたのに、今は10秒で終わるよ!」
といった実感を持ってもらえます。
これは、使うほどに有難さが増すものです。

使い所:「単機能」をテストする

テストしたい「単機能」だけ、時間計測付きプロシージャで、Call で呼び出します。
こうする事で、「単機能」の単位で時間計測ができます。

イミディエイトウィンドウに表示させる

開発中は、こちらを使うことが多いですね。
メッセージボックスで表示する時との違いは、MsgBox が、Debug.Print になっただけ、です。

コード

Sub セルA1からA10に1を入力()

  '時間を計測・・・計測開始
  Dim StartTime, StopTime As Variant
  StartTime = Time

  'ここは好きなコードを書く
  Dim i as Integer
  For i = 1 To 10
    Cells(i, 1).Value = 1
  Next i

  '時間を計測・・・計測結果を表示
  StopTime = Time
  StopTime = StopTime - StartTime
  Debug.Print "所要時間:" & Minute(StopTime) & "分 " & Second(StopTime) & "秒"

  'セルA1を選択
  Range("A1").Select

End Sub

使い所:デバックに便利

以前はセルに書き出してデバックしていたのですが、結構セルが汚れて見える、というか、美しく見える方法が見付からず、あまり気に入っていませんでした。
こちらの イミディエイトウィンドウに表示させる方法なら、ポップアップもなければ、セルも汚れません。

コードの所々に、”〇〇機能の完了:〇分〇秒” と表示させると、時間が掛かっている所を発見できたりして便利です。

セルに書き出す

メッセージボックスで表示する時との違いは、MsgBox が Range(“B1”).Value になっただけです。

コード

Sub セルA1からA10に1を入力()

  '時間を計測・・・計測開始
  Dim StartTime, StopTime As Variant
  StartTime = Time

  'ここは好きなコードを書く
  '例えば集計するコードなど

  '時間を計測・・・計測結果を表示
  StopTime = Time
  StopTime = StopTime - StartTime
  Range("B1").Value = "取得時間:" & Minute(StopTime) & "分 " & Second(StopTime) & "秒"

  'セルA1を選択
  Range("A1").Select

End Sub

使い所:「取得時間を記録しておく」といった時に便利

例えば、Webから自動で情報を取得するマクロを作ったとします。
あるいは、事務で集計するマクロでも良いです。
(マクロと表現するのは正しくありませんが、事務現場ではこのほうが通じ易いので、あえて)
こういった時、「いつ情報を取得したのか分かると便利」といった要望があったので、管理業務などでは、こちらのコードも使う様にしています。

コメント

タイトルとURLをコピーしました