PR

Excel VBAの処理速度を劇的に改善!|Application.Calculation Manual/Automaticの使い方

Excel
記事内に広告が含まれています。

Excel VBAでマクロを実行したとき、
「処理が終わるまで異常に時間がかかる」「なぜこんなに遅いのか分からない」
と感じたことはありませんか。

大量のセル更新やループ処理を行うマクロでは、Excelの自動再計算が原因で処理速度が大きく低下していることがあります。
この再計算を制御するのが、「Application.Calculation」 です。

VBAの処理前に再計算を手動に切り替え、終了後に元へ戻すだけで、
数分かかっていた処理が数秒で終わるケースも珍しくありません。

この記事では、Application.Calculationの基本的な仕組みと使い方、実際に処理速度が変わるかの簡単な実験、特に効果が出やすいケース、さらにエラーで止まっても安心な注意点まで、VBA初心者にも分かるように解説します。

「マクロが遅い」と悩んでいる方は、まずここから試してみてください。

🔍今回の記事で分かること
  • VBAの処理速度が遅くなる原因
  • Application.Calculationの説明と基本的な使い方
  • Application.Calculation有無の比較および使用上の注意点

VBAの処理速度が遅くなる原因とは?

Excel VBAでマクロを実行したとき、
「なぜこんなに時間がかかるのか」
と感じたことはありませんか?

特に、大量のセルに値を書き込んだり、ループ処理の中で数式セルを更新したりすると、処理時間が一気に伸びることがあります。

その大きな原因のひとつが、Excelの自動再計算です。
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の使用有無を比較するための内容を表示している画面

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

application.calculationを使用していない状態で処理を行った結果の画面

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

application.calculationでManualに変更した状態で処理を行った結果の画面

このとおり、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を制御できる余地がないかを確認してみてください。
小さな修正でも、処理時間が大きく変わることがあります。

最後まで読んでいただき、ありがとうございました。

ろじゃー

仕事・子育てに奮闘中の社会人です。
仕事でも日常生活でも、ちょっとでも便利になることが紹介できるブログを書いています!
 
仕事柄、PC操作やエクセル、VBAなどは得意です!
Excel歴は10年以上の事務職。
関数やVBAを活用して、資料作成やデータ分析をはじめとした様々な業務の効率化・自動化に取り組んできました。
 
このブログでは、実際の業務で使える効率化テクニックを発信しています。
「わからない」や「困った」など問題を抱える方や、もっと効率化したいと思っている方に、少しでも役立てれば幸いです!

ご質問・ご相談など、お気軽にご連絡ください。

ろじゃーをフォローする
ご質問・ご相談はこちらへ!
 ろじゃー|日々、ちょっとずつ良くなることを目指すブロガー
Excel歴10年以上。VBAや関数、業務効率化などを発信中。
📩 お問い合わせはこちら
Excel
シェアする
ろじゃーをフォローする

コメント

タイトルとURLをコピーしました