VBAの処理速度を計測して最適化する方法|Timer関数とScreenUpdatingの使い方

VBAの処理速度を計測するには Timer 関数を使います。処理の前後で Timer の値を取得して引き算すると、何秒かかったかがわかります。どこが遅いかを把握してから最適化することで、改善の効果を数値で確認できます。

この記事では、次の内容を順番に解説します。

  • Timer関数で処理時間を計測する方法
  • ScreenUpdatingとCalculationで速くする方法
  • 改善前後の時間を比較する方法

Timer関数で処理時間を計測するには?

Timer 関数は「午前0時からの経過秒数」を返します。処理の前後で取得して引き算すると、その処理にかかった秒数がわかります。

Dim startTime As Double
Dim endTime As Double

startTime = Timer ' 処理前の時刻を記録

' ★ここに計測したい処理を書く

endTime = Timer ' 処理後の時刻を記録
MsgBox "処理時間: " & Format(endTime - startTime, "0.00") & " 秒"

具体例:1万セルに値を入れる処理を計測する

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行に数字を入れる処理の時間を計測しています。まずこのまま実行して、何秒かかるかを確認してみましょう。

処理を速くするには?

処理を速くするための代表的な方法が2つあります。処理の最初に設定して、最後に元に戻すのがセットになります。

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

2つの設定の意味

  • ScreenUpdating = False:処理中の画面の更新を止めます。セルの値が変わるたびに画面が再描画されるのを防ぐことで、処理が速くなります。
  • Calculation = xlCalculationManual:自動計算を止めます。Excelはセルが変わるたびに関数を再計算しますが、それを手動にすることで処理が速くなります。

処理が終わったら必ず TruexlCalculationAutomatic に戻してください。戻し忘れると、マクロが終わった後もExcelが自動計算をしない状態のままになります。

改善前後の時間を比較するには?

改善前と改善後の処理時間を並べて表示すると、効果がひと目でわかります。

Dim oldTime As Double
Dim newTime As Double

' 改善前の計測
startTime = Timer
Call FillCells_Before
oldTime = Timer - startTime

' 改善後の計測
startTime = Timer
Call FillCells_After
newTime = Timer - startTime

MsgBox "改善前: " & Format(oldTime, "0.00") & "秒" & vbCrLf & _
       "改善後: " & Format(newTime, "0.00") & "秒"

まとめ

処理速度の改善は「計測 → 改善 → 再計測」の順番で進めるのが基本です。

  • 計測方法startTime = Timer → 処理 → endTime = Timer → 引き算で秒数を確認。
  • 速くする方法①ScreenUpdating = False で画面更新を止める。
  • 速くする方法②Calculation = xlCalculationManual で自動計算を止める。
  • 必ず元に戻す:処理後に TruexlCalculationAutomatic に戻す。

よくある質問

TimerとNow関数はどう違う?

Timer は「午前0時からの経過秒数」を小数点付きで返すため、0.01秒単位の精度があります。Now は現在の日時を返しますが、秒以下の精度が低いです。短い処理の計測には Timer の方が適しています。数分かかるような長い処理には Now でも十分です。

ScreenUpdatingをFalseにしたまま終了するとどうなる?

マクロが途中でエラーになって止まった場合、True に戻す処理が実行されないことがあります。その場合はExcelの画面が更新されない状態が続きます。対策として、エラー処理(On Error GoTo)の中でも ScreenUpdating = True を実行するようにしておくと安全です。

Calculation = xlCalculationManualにするとどんな影響がある?

マクロが終わった後も手動計算のままになると、セルのデータを変えても関数が再計算されません。F9キーを押すと手動で再計算できますが、気づかずに古い値を見てしまう危険があります。必ず処理後に xlCalculationAutomatic に戻してください。

他にも処理を速くする方法はある?

主なものとして、①SelectやActivateを使わない(シートを直接指定する)、②ループの中でセルに1回ずつ書き込まずに配列にまとめて一括書き込みする、③SpecialCellsで対象セルを絞る、などがあります。

処理時間が毎回違う場合は?

パソコンの状態(他のアプリが動いているかなど)によって多少変動します。正確に比較したい場合は同じ条件で複数回計測して平均を取るか、大まかな傾向で判断するのが現実的です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール