Excel VBAでマクロを実行したとき、
「処理が終わるまで異常に時間がかかる」「なぜこんなに遅いのか分からない」
と感じたことはありませんか。
大量のセル更新やループ処理を行うマクロでは、Excelの自動再計算が原因で処理速度が大きく低下していることがあります。
この再計算を制御するのが、「Application.Calculation」 です。
VBAの処理前に再計算を手動に切り替え、終了後に元へ戻すだけで、
数分かかっていた処理が数秒で終わるケースも珍しくありません。
この記事では、Application.Calculationの基本的な仕組みと使い方、実際に処理速度が変わるかの簡単な実験、特に効果が出やすいケース、さらにエラーで止まっても安心な注意点まで、VBA初心者にも分かるように解説します。
「マクロが遅い」と悩んでいる方は、まずここから試してみてください。
- VBAの処理速度が遅くなる原因
- Application.Calculationの説明と基本的な使い方
- Application.Calculation有無の比較および使用上の注意点
VBAの処理速度が遅くなる原因とは?
Excel VBAでマクロを実行したとき、
「なぜこんなに時間がかかるのか」
と感じたことはありませんか?
特に、大量のセルに値を書き込んだり、ループ処理の中で数式セルを更新したりすると、処理時間が一気に伸びることがあります。
その大きな原因のひとつが、Excelの自動再計算です。
Excelの「数式」タブにある、「計算方法の設定」と言えばピンとくる方も多いと思います。

Excelはセルの値が変わるたびに、関連する数式を自動で再計算します。
便利な仕組みですが、VBAで何百・何千回もセルを書き換える場合、この再計算が毎回走り、処理速度を大きく低下させる原因にもなります。
Application.Calculationの説明と基本的な使い方
Application.Calculationは、Excelの再計算方法を制御するためのプロパティです。
3つの計算モードがありますが、主に「Automatic」と「Manual」の2つを覚えておけば十分です。
| 名前 | 説明 |
|---|---|
| xlCalculationAutomatic | すべて自動で再計算(通常のExcel) |
| xlCalculationManual | 何も自動では再計算しない |
| xlCalculationSemiautomatic | だいたい自動計算だけど、一部だけ手動 (What-if分析のデータテーブル) |
VBAで処理速度を上げたい場合、マクロの開始時に再計算を手動に切り替え、処理が終わったら元に戻す、という使い方をします。
'■Manual → Automaticの流れで入力する
Application.Calculation = xlCalculationManual
' ここに処理を書く
Application.Calculation = xlCalculationAutomaticこれだけでも、マクロの実行時間が大幅に短縮されるケースは少なくありません。
Calculationを使うときの注意点と安全な書き方(エラー対策)
Application.Calculationを使って再計算を手動に切り替える場合、ひとつだけ注意すべき点があります。
それは、処理の途中でエラーが発生すると、Calculationが元に戻らない可能性があるということです。
VBAでは、エラーが発生した時点で以降のコードが実行されません。
そのため、Calculationを手動にしたあとでエラーが起きると、自動再計算に戻す処理まで到達せず、Excelが「再計算されない状態」のまま残ってしまいます。
この状態になると、セルの値を変更しても数式の結果が更新されず、「Excelの挙動がおかしい」と感じる原因になります。
これを防ぐためには、エラーが発生しても必ずCalculationを元に戻す書き方をしておくことが重要です。
個人で使うマクロであれば、処理の最後で次のように自動計算へ戻すだけでも十分です。
'■エラーが発生した場合、Finally以降に記載の処理を実行
On Error GoTo Finally
Application.Calculation = xlCalculationManual
' 処理内容
Finally:
Application.Calculation = xlCalculationAutomaticこのように、後処理用のラベルを用意しておくことで、途中でエラーが起きてもCalculationを自動に戻すことができます。
【実例】Calculationの有無で処理速度を比較してみた
では、実際にCalculationを切り替えると、どれくらい差が出るのでしょうか。
例えば、ループで大量のセルに値を書き込む処理を行った場合、Calculationを自動のままにすると、セルを書き換えるたびに再計算が発生し、処理が重たくなってしまいます。
一方、手動に切り替えると、処理中は再計算が行われないので、最後にまとめて再計算されます。結果自動計算のときより処理速度がアップします。
試しに、1万行分の計算を繰り返すVBAを使用して、処理速度がどのくらいかかるか実験してみました。
内容としては、
・シート1には1万行分のデータあり
・シート1のC列に、シート2から単価をVLOOKUP関数で拾う
・シート1のB列×C列計算結果をD列に表示
という内容で、どのくらい処理速度に影響があるかを確認してみました。

こちらは、「Application.Calculation」を使わず、都度再計算したケースです。
1万行分の処理に、87.91秒の時間がかかっています。

次は、「Application.Calculation」で、Manual開始→終了後Automaticに変更するパターンです。
なんと、1万行分の処理を6.99秒の時間で完了することができました!(約80秒の処理速度アップ)

このとおり、Calculationを切り替えることで、処理速度が格段に上がるケースがあります。
Calculationによる高速化が特に効果的なケース
Application.Calculationによる高速化は、すべてのマクロで同じ効果が出るわけではありません。
特に効果が大きいのは、次のようなケースです。
★Calculationによる高速化が特に効果的なケース
✅数式が大量に入ったシートを更新する処理
✅ループ内でセルを書き換える回数が多い処理
✅VLOOKUPやSUMIFSなど、計算負荷の高い数式が多いブック
✅複数シートにまたがって値を更新する処理
ここに記載のとおり、「大量のデータ処理を行う」場合や、「複雑な計算を処理する」場合などが特に効果を大きく感じます。
逆に、セル操作が少ないマクロでは、体感できるほどの差が出ないこともあります。
ScreenUpdating・EnableEventsとの違いと使い分け
VBA高速化の定番として、次の2つもよく使われます。
| プロパティ | 説明 |
|---|---|
| Application.ScreenUpdating | 画面表示の更新を有効にするかどうか ・FALSEの場合、画面を更新しない ・TRUEの場合、画面更新を有効にする ※高速化したいときはFALSEを選択 |
| Application.EnableEvents | イベントの発生を有効にするかどうか ・FALSEの場合、イベントを発生させない ・TRUEの場合、イベントが発生可能 ※高速化したいときはFALSEを選択 |
ScreenUpdatingは画面の描画を止める設定で、見た目のチラつきを抑えつつ処理を高速化します。EnableEventsは、セル変更時などに発生するイベント処理を一時的に無効化します。
Calculationは「再計算」、ScreenUpdatingは「画面描画」、EnableEventsは「イベント処理」を止めるもので、それぞれ役割が異なります。
そのため、重い処理ではこれらを組み合わせて使うのが効果的です。
まとめ|VBAの処理が遅いならまずCalculationを疑おう
VBAの処理速度が遅いと感じたら、まず疑うべきなのがApplication.Calculationです。
再計算を一時的に手動に切り替えるだけで、処理時間が劇的に改善することがあります。
ただし、マクロ終了時には必ず元の状態に戻すことが重要です。
Calculationの制御を正しく使いこなせば、VBAのパフォーマンスは一段上のレベルになります。
まずは、今使っているマクロの中に、Application.Calculationを制御できる余地がないかを確認してみてください。
小さな修正でも、処理時間が大きく変わることがあります。
最後まで読んでいただき、ありがとうございました。




コメント