【ExcelVBA入門】処理時間を計測するためのTimer関数の使い方とは

皆さんは、VBAで処理時間を計測する方法を知っていますか?

VBAを書いていると処理が重たくなるケースがよくあるため、処理時間を計測する方法を知っておくと便利です。そこで今回は、

  • 処理時間を計測するためのTimer関数の使い方
  • Timer関数を使った具体的なサンプルコード
  • Timer関数を使って処理を高速化する方法

といった基礎的なことから、応用的な方法まで、徹底的に解説します!

目次

Timer関数の使い方

最初に、Timer関数の使い方について簡単に解説します。

使い方:

Timer

実行すると、戻り値として午前0時0分0秒からの経過時間を取得できます。処理時間を計測するときは、以下のように開始時終了時にTimer関数を使って以下のように使います。

Dim startTime As Double
Dim endTime As Double
Dim processTime As Double

'開始時間取得
startTime = Timer


'メイン処理


'終了時間取得
endTime = Timer

'処理時間計算
processTime = endTime - startTime

開始時、終了時にTimer関数を使って時間を計測し、終了時間から開始時間をひくことで、時間を計測しています。このように、簡単に処理時間を計測することができます。

サンプルコード

次に、サンプルコードをもとに、具体的な使い方を解説します。

サンプルコード:

Sub Test()
  Dim startTime As Double
  Dim endTime As Double
  Dim processTime As Double
  Dim i As Long

  '開始時間取得
  startTime = Timer

  'メイン処理
  For i = 1 To 10000
    Cells(i, 1) = "侍エンジニア"
  Next i

  '終了時間取得
  endTime = Timer

  '処理時間表示
  processTime = endTime - startTime
  MsgBox "処理時間:" & processTime
End Sub

画像:実行結果

このように簡単に計測することができます。

Timer関数を使って処理を高速化する方法

ここまでTimer関数を使った処理時間の計測方法を解説してきました。

ただ、処理を高速化するためには、どの処理が遅くなっているか確認する必要がありますよね。1行ずつ実行にかかった時間計測するためには、Debug.Printを使ってイミディエイトウィンドウに時間を出すのがおすすめです!

サンプルコード:

Sub Test2()
  Dim startTime As Double
  Dim middleTime As Double
  Dim processTime As Double
  Dim i As Long

  '開始時間取得
  startTime = Timer

  'メイン処理1
  For i = 1 To 10000
    Cells(i, 1) = "侍エンジニア"
  Next i

  'メイン処理1の時間をイミディエイトウィンドウに出力
  middleTime = Timer
  processTime = middleTime - startTime
  Debug.Print "メイン処理1:"; processTime & vbCrLf

  'メイン処理2
  For i = 1 To 50
    ActiveSheet.Cells(i, 1).Select
    Selection.Copy
    ActiveSheet.Cells(i, 2).Select
    ActiveSheet.Paste
  Next i

  'メイン処理2の時間をイミディエイトウィンドウに出力
  middleTime = Timer
  processTime = middleTime - startTime
  Debug.Print "メイン処理2:"; processTime & vbCrLf

End Sub

実行結果:

メイン処理1: 0.3984375
メイン処理2: 4.90625

結果を見てみると、メイン処理2が遅いことがわかります。

メイン処理2では、「コピー元セル選択 → セルコピー → コピー先セル選択 → 貼り付け」の流れになっていますが、セルのコピー・ペーストは以下のように1行に変更することで、処理を高速化することができます。

改善後のコードサンプル:

Sub Test3()
  Dim startTime As Double
  Dim middleTime As Double
  Dim processTime As Double
  Dim i As Long

  '開始時間取得
  startTime = Timer

  'メイン処理1
  For i = 1 To 10000
    Cells(i, 1) = "侍エンジニア"
  Next i

  'メイン処理1の時間をイミディエイトウィンドウに出力
  middleTime = Timer
  processTime = middleTime - startTime
  Debug.Print "メイン処理1:"; processTime

  'メイン処理2
  For i = 1 To 50
    ActiveSheet.Cells(i, 1).Copy Destination:=ActiveSheet.Cells(i, 2)
  Next i

  'メイン処理2の時間をイミディエイトウィンドウに出力
  middleTime = Timer
  processTime = middleTime - startTime
  Debug.Print "メイン処理2:"; processTime

End Sub

実行結果:

メイン処理1: 0.40015625
メイン処理2: 2.6875

このように、細かく処理を分解して計測時間を確認する方法を知っておくだけで、原因を調べて対応することができます。

この方法以外にも、処理高速化テクニックについては以下で詳しくまとめているので、気になる方は見てみてくださいね!

補足:日付を扱う方法

Timer関数は処理時間計測時にはとても便利ですが、値がシリアル値になっているため時刻としては使えません。

時刻を確認したい場合は、Format関数とNow関数を組み合わせて以下のように書くのがおすすめです!

Format(now(),"HH:MM:SS")

日付・時刻の取得方法については以下で詳しく解説しているので、気になる方は見てみてくださいね!

まとめ

今回は、VBAで処理時間を計測するためのTimer関数の使い方について解説しました。ちょっと処理が重たいなと感じたときは、Timer関数を使って処理時間を確認してみるのがおすすすめです。

使い方も簡単なので、ぜひ使ってみてくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次