Application.ScreenUpdating = False
と並んで、VBAマクロを高速化するための二大巨頭と言えるのが、計算方法の一時的な手動化です。
数式が多く含まれるシートにVBAで値を次々と書き込んでいくと、その都度Excelが再計算を行うため、処理が極端に遅くなります。
この記事では、Application.Calculation
プロパティを使い、マクロの実行中だけ計算を手動に切り替え、処理が終わったら元の状態に戻すという、高速化のための必須テクニックを解説します。
なぜ計算を手動にすると速くなるのか?
Excelの計算方法が「自動」の場合、いずれかのセルの値が変更されると、そのセルを参照しているすべての数式が再計算されます。VBAで何千ものセルに値を入力するループ処理を行うと、この再計算が何千回も発生し、膨大な待ち時間となります。
マクロの実行前に計算方法を「手動」に切り替えることで、この無駄な再計算をすべてスキップし、VBAは値の書き込み処理に専念できるため、処理速度が劇的に向上します。
完成したVBAコード(推奨パターン)
ScreenUpdating
と同様に、Calculation
プロパティもマクロの実行後に必ず元の状態に戻すのが鉄則です。エラーが発生しても確実に元の設定に戻せるよう、エラーハンドリングを組み込んだ以下のパターンを推奨します。
Sub ProcessWithManualCalculation()
' 変数を宣言します
Dim originalCalcMode As XlCalculation
'--- 1. 処理前の準備 ---
' 元の計算方法を記憶
originalCalcMode = Application.Calculation
' 画面更新とイベントもオフにすると、さらに高速化
Application.ScreenUpdating = False
Application.EnableEvents = False
' 計算方法を手動に設定
Application.Calculation = xlCalculationManual
' エラーが発生しても必ず設定を元に戻すための準備
On Error GoTo ErrorHandler
'--- 2. メインの処理 ---
' (例:数式が参照しているセルに大量のデータを入力する処理)
Dim i As Long
For i = 1 To 20000
ThisWorkbook.Worksheets("DataInput").Cells(i, 1).Value = Rnd() * 100
Next i
' (任意) 必要であれば、この時点で一度手動で再計算を実行
' Application.Calculate
'--- 3. 処理後に、各設定を必ず元の状態に戻す ---
ExitRoutine:
Application.Calculation = originalCalcMode
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox "処理が完了しました。"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume ExitRoutine ' エラーが発生しても必ず設定を元に戻す
End Sub
コードのポイント解説
① 元の計算方法を記憶
originalCalcMode = Application.Calculation
マクロがユーザーのExcel設定を勝手に変更してしまわないように、まず現在の計算方法をoriginalCalcMode
という変数に記憶しておきます。
② 計算方法を手動に設定
Application.Calculation = xlCalculationManual
Application.Calculation
プロパティに、手動計算を示す定数xlCalculationManual
を設定します。これにより、マクロによる値の変更では再計算が一切行われなくなります。
③ 手動での再計算 Application.Calculate
' Application.Calculate
計算が手動の間、すべての計算結果は古いままです。もし、メイン処理が終わった時点で最新の計算結果が必要な場合は、Application.Calculate
メソッドを実行します。これは、F9
キーを押してブック全体を再計算するのと同じ操作です。
④ 計算方法を元に戻す
Application.Calculation = originalCalcMode
On Error GoTo
を使ったエラーハンドリング構文により、処理が正常に完了した場合でも、途中でエラーが発生した場合でも、必ずマクロの最後でこの行が実行されます。 ①で記憶しておいた元の設定(originalCalcMode
)に戻すことで、ユーザーがマクロ実行前の状態で作業を再開できるようにしています。
計算方法の主な設定値
VBA定数 | 計算モード | 説明 |
xlCalculationAutomatic | 自動 | (規定値) 数式が参照するいずれかのデータが変更されると、自動で再計算。 |
xlCalculationManual | 手動 | F9キーを押すか、VBAで命令しない限り再計算されない。 |
xlCalculationSemiautomatic | データテーブル以外自動 | データテーブルを除くすべての数式が自動で再計算される。 |
まとめ
VBAマクロの高速化において、ScreenUpdating
とCalculation
の制御は基本であり、絶大な効果を発揮します。
- 処理の開始前に、現在の
Application.Calculation
の状態を変数に記憶する。 Application.Calculation = xlCalculationManual
で計算を手動にする。- メインの処理を実行する。
- (任意) 必要に応じて
Application.Calculate
で再計算する。 - 処理の最後に、記憶しておいた変数を使い、計算方法を元の状態に戻す。
データ入力やセルの書式設定など、数式の再計算を引き起こす可能性のある処理を大量に行う場合は、必ずこのパターンを適用してください。