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はセルが変わるたびに関数を再計算しますが、それを手動にすることで処理が速くなります。
処理が終わったら必ず True と xlCalculationAutomatic に戻してください。戻し忘れると、マクロが終わった後も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で自動計算を止める。 - 必ず元に戻す:処理後に
TrueとxlCalculationAutomaticに戻す。
よくある質問
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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



