皆さんは、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関数を使って処理時間を確認してみるのがおすすすめです。
使い方も簡単なので、ぜひ使ってみてくださいね!