【Excelマクロ】処理速度を計測して、VBAを最適化しよう

なぜ処理時間を測るのか?

Excel VBAでマクロを作ると、データが増えるにつれて「遅い」「止まる」といった問題が発生しやすくなります。そこでまず行うべきは、どの処理に時間がかかっているのかを「見える化」することです。

処理時間を正確に把握することで、次のメリットがあります。

  • 遅い原因の特定ができる
  • 最適化の効果が数値で確認できる

処理時間の測り方と、その情報を活かしたVBAの最適化の基本について解説します。

測定することの効果

  • マクロの速度を測定して、改善ポイントを特定する
  • 計測コードを活用して、最適化の前後を比較する
  • 実務で「速さの根拠」を持ったVBA改善ができるようになる

処理時間の測定方法:Now関数を使う

次に、処理の開始時間と終了時間を記録して、所要時間を表示する簡単な方法を紹介します。

基本構文

Dim startTime As Double
Dim endTime As Double

startTime = Timer ' 開始時刻(秒)

' ★ここに処理を入れる

endTime = Timer ' 終了時刻
MsgBox "処理時間: " & Format(endTime - startTime, "0.00") & " 秒"

解説

  • Timer 関数は、日付に関係なく「午前0時からの経過秒数」を返します。
  • NowTime では小数秒の精度がやや低くなるため、Timer を使うのが実務的です。

具体例:10000セルに値を入れる処理

Sub FillCells()

    Dim startTime As Double
    Dim endTime As Double
    Dim i As Long

    startTime = Timer

    For i = 1 To 10000
        Cells(i, 1).Value = i
    Next i

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

End Sub

このコードの意味

  • A列1〜10000行に、1から順番に数字を入れる処理
  • 前後でTimer関数を使って秒数を計測

このようにして、時間のかかる処理の実行時間を把握できます。

より速くするテクニックを試してみよう

計測した後に、改善テクニックを適用して、効果を比較しましょう。

改善例(画面更新や自動計算の一時停止)

Sub FillCells_Optimized()

    Dim startTime As Double
    Dim endTime As Double
    Dim i As Long

    startTime = Timer

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    For i = 1 To 10000
        Cells(i, 1).Value = i
    Next i

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    endTime = Timer
    MsgBox "処理時間(最適化後): " & Format(endTime - startTime, "0.00") & " 秒"
End Sub

解説

  • ScreenUpdatingFalseにすると、画面の遷移(チラつき)を止めて、高速化できます。
  • CalculationManualにすると、毎回の再計算を止めて時間短縮ができます。
    ※Excelでは、データが更新されるたびに自動で関数などが計算されるため、その処理を止めることでスピードが速くなります。

効果の比較をしてみよう

改善前と改善後で、実際にどれくらいの時間差が出るのかを確認してみましょう。 たとえば以下のように、処理時間をMsgBoxで並べて表示することもできます。

MsgBox "改善前: " & oldTime & "秒" & vbCrLf & "改善後: " & newTime & "秒"

Now関数で計測する場合

Dim startTime As Date
Dim endTime As Date

startTime = Now
' 処理
endTime = Now

MsgBox "所要時間: " & Format(endTime - startTime, "hh:mm:ss")
  • 時間の精度はやや低いが、「分単位の処理」には使える
  • Timerで十分な精度が得られるケースが多いため、Timerの方が扱いやすい

まとめ

VBAで処理の最適化をするには、まず「どこに時間がかかっているか」を把握することが大切です。その第一歩として、処理速度を「測定」することから始めましょう。

Timer関数を使えば、数行のコードで簡単に秒単位の処理時間を確認できます。

また、ScreenUpdatingやCalculationなどの設定を見直すだけでも、大きな高速化につながるケースは多くあります。

まずは、既存のマクロの前後に計測コードを入れて、どの処理に時間がかかっているのかを可視化してみてください。そして、改善をしたあとにもう一度計測し、その差を比較してみると、最適化の効果を実感できるはずです。

数字で改善の効果を確認できるようになると、自分で考えた結果がわかるため、VBAがさらに楽しく、やりがいのある作業になります。

コメント