【ExcelVBA・マクロ】Timer関数の使い方|マクロの処理時間を計測して高速化の効果を確認する方法【コピペOK】

ExcelVBA

「このマクロ、実際どれくらい時間がかかっているんだろう」「高速化のために処理を書き換えたけど、本当に速くなったのか分からない」——そんなときに使えるのがVBAのTimer関数です。

この記事では、Timer関数を使ってマクロの処理時間を計測する基本的な方法から、高速化の効果を数値で確認する実践例、計測時に気をつけたい注意点まで解説します。処理速度の改善に取り組んでいる方はぜひ参考にしてください。

スポンサーリンク
スポンサーリンク

Timer関数とは

Timer関数は、その日の午前0時からの経過秒数を返す関数です。処理の開始時と終了時にそれぞれTimerの値を取得し、差を計算することで、処理にかかった時間(秒)を求めることができます。

Sub ShowCurrentTimer()
    MsgBox Timer & " 秒(午前0時からの経過秒数)"
End Sub

基本的な使い方

処理の前後でTimerの値を変数に保存し、その差を計算するのが基本パターンです。

Sub MeasureProcessTime()
    Dim startTime As Single
    Dim endTime As Single
    Dim i As Long
    Dim dummy As Long

    startTime = Timer

    ' 計測したい処理(ここではサンプルとして単純なループ)
    For i = 1 To 1000000
        dummy = i * 2
    Next i

    endTime = Timer

    MsgBox "処理時間: " & Format(endTime - startTime, "0.00") & " 秒"
End Sub

startTimeendTimeは小数点を扱うためSingle型で宣言します。Format関数で小数点2桁に整えることで、見やすい表示になります。

実践例:高速化前後の処理時間を比較する

Timer関数が特に役立つのは、「処理を書き換えて本当に速くなったか」を数値で確認するときです。以下は、セルを1つずつ処理する方法と、配列にまとめて処理する方法の速度差を計測する例です。

Sub CompareProcessSpeed()
    Dim startTime As Single
    Dim resultText As String
    Dim i As Long
    Dim ws As Worksheet
    Dim buf() As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' パターン1: セルを1つずつ処理(遅い方法)
    startTime = Timer
    For i = 1 To 10000
        ws.Cells(i, 1).Value = i * 2
    Next i
    resultText = "セル直接処理: " & Format(Timer - startTime, "0.000") & " 秒" & vbCrLf

    ' パターン2: 配列にまとめてから一括で書き込む(速い方法)
    ReDim buf(1 To 10000, 1 To 1)

    startTime = Timer
    For i = 1 To 10000
        buf(i, 1) = i * 2
    Next i
    ws.Cells(1, 2).Resize(10000, 1).Value = buf

    resultText = resultText & "配列一括処理: " & Format(Timer - startTime, "0.000") & " 秒"

    MsgBox resultText
End Sub

このように同じ処理を2つの方法で実装し、それぞれの処理時間をTimerで計測すれば、「配列でまとめて書き込んだほうが速い」といった改善効果を具体的な数値で確認できます。

経過時間をイミディエイトウィンドウに記録する

処理途中の経過時間を細かく確認したい場合は、MsgBoxの代わりにDebug.Printでイミディエイトウィンドウに出力すると、処理を止めずに記録を残せます。

Sub LogTimerToImmediate()
    Dim startTime As Single
    startTime = Timer

    Debug.Print "処理開始: " & Format(Now, "hh:mm:ss")

    ' 何らかの処理
    Application.Wait Now + TimeValue("0:00:02")

    Debug.Print "処理終了までの経過時間: " & Format(Timer - startTime, "0.00") & " 秒"
End Sub

計測時の注意点

Timer関数を使う際は、以下の点に注意してください。

  • 日をまたぐと計測が狂うTimerは午前0時にリセットされるため、深夜0時をまたぐ処理を計測すると、endTime - startTimeがマイナスになってしまいます。長時間バッチ処理を計測する場合はNow関数とDateDiffを組み合わせる方が安全です。
  • 精度は1/100秒程度:非常に短い処理(数ミリ秒単位)の差を厳密に比較したい場合、Timerの精度では不十分なことがあります。数千〜数百万回のループなど、ある程度まとまった処理量で計測すると安定した結果が得られます。
  • 他の処理の影響を受ける:バックグラウンドでOSやExcelが別の処理を行っていると、計測結果に多少のばらつきが出ます。複数回計測して平均を取ると、より信頼できる数値になります。

まとめ

  • Timer関数はその日の午前0時からの経過秒数を返す
  • 処理の前後でTimerの値を取得し、差を計算することで処理時間を計測できる
  • 高速化前後の処理時間を数値で比較すれば、改善効果を客観的に確認できる
  • 日をまたぐ処理では計測が狂うため、Now関数とDateDiffの利用を検討する
  • 計測結果には多少のばらつきが出るため、複数回計測して比較するのがおすすめ

処理速度の改善は「体感」だけでは判断しづらいものです。Timer関数を使って数値で見える化することで、どの改善が効果的だったのかを正確に把握できるようになります。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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