なぜ処理時間を測るのか?
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時からの経過秒数」を返します。Now
やTime
では小数秒の精度がやや低くなるため、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
解説
ScreenUpdating
をFalse
にすると、画面の遷移(チラつき)を止めて、高速化できます。Calculation
をManual
にすると、毎回の再計算を止めて時間短縮ができます。
※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がさらに楽しく、やりがいのある作業になります。
コメント