【Excel VBA】計算方法を手動にしてマクロを高速化する Application.Calculation

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マクロの高速化において、ScreenUpdatingCalculationの制御は基本であり、絶大な効果を発揮します。

  1. 処理の開始前に、現在のApplication.Calculation状態を変数に記憶する。
  2. Application.Calculation = xlCalculationManual計算を手動にする。
  3. メインの処理を実行する。
  4. (任意) 必要に応じてApplication.Calculateで再計算する。
  5. 処理の最後に、記憶しておいた変数を使い、計算方法を元の状態に戻す

データ入力やセルの書式設定など、数式の再計算を引き起こす可能性のある処理を大量に行う場合は、必ずこのパターンを適用してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次