マクロが遅いときは、次の5つを見直すだけで動きが大きく改善することがあります。
- 画面更新を止める(ScreenUpdating)
- 自動計算を一時的に止める(Calculation)
- 自動で動く処理を止める(EnableEvents)
- SelectやActivateをなるべく使わない
- With構文でコードをまとめる
特別な知識がなくても、コードの最初と最後に数行追加するだけで対応できるものがほとんどです。順番に見ていきましょう。
画面更新を止めると何が変わる?
Excelはマクロが動いている間も、セルの色や値が変わるたびに画面をその都度更新しようとします。この画面の書き換えがとても重く、マクロが遅くなる大きな原因のひとつです。
Application.ScreenUpdating = False を最初に書いておくと、処理中は画面を更新しなくなります。処理が終わってから一気に結果を表示するので、体感速度がぐっと上がります。
Application.ScreenUpdating = False
' ここにメインの処理を書く
Application.ScreenUpdating = True
処理が終わったら必ず True に戻しましょう。戻し忘れると、その後の操作で画面が更新されなくなってしまいます。
自動計算を止めると何が変わる?
シートに数式がたくさん入っている場合、セルの値が変わるたびにすべての数式が再計算されます。データ量が多いほど、この再計算に時間がかかってマクロが遅くなります。
Application.Calculation = xlCalculationManual で計算を手動に切り替えると、マクロが動いている間は再計算が行われなくなります。
Application.Calculation = xlCalculationManual
' ここにメインの処理を書く
Application.Calculation = xlCalculationAutomatic
こちらも処理が終わったら必ず xlCalculationAutomatic(自動)に戻してください。戻し忘れると、その後にセルを編集しても数式が自動で計算されなくなります。
自動で動く処理を止めるとは?
Excelには「セルが変更されたら自動で動く処理」を設定できる仕組みがあります(Worksheet_Changeなど)。マクロが動いている最中にこういった処理が何度も起動してしまうと、動作が遅くなったり、意図しない動きになったりします。
Application.EnableEvents = False を最初に書いておくと、マクロの実行中にこういった自動処理が起動しなくなります。
Application.EnableEvents = False
' ここにメインの処理を書く
Application.EnableEvents = True
こちらも処理後は必ず True に戻してください。
SelectやActivateをなるべく使わない方がいい理由は?
マクロの自動記録を使うと、Select や Activate がたくさん入ったコードが生成されます。しかしこれらを毎回実行するのはムダな処理が増えて遅くなる原因になります。
シートやセルは直接指定できるので、Select を使わなくて済む書き方に変えましょう。
' 遅くなりやすい書き方
Sheets("データ").Select
Range("A1").Select
ActiveCell.Value = "売上"
' 速くてすっきりした書き方
Sheets("データ").Range("A1").Value = "売上"
直接指定する書き方の方が、コードも短くて読みやすくなります。
With構文を使うとどう変わる?
同じシートやセル範囲に対して何度も処理をする場合、With ~ End With でまとめて書くことができます。毎回シート名を書かなくて済むので、コードが短くなり、処理も少し速くなります。
With Sheets("入力")
.Range("B2").Value = "OK"
.Range("B3").Value = "NG"
.Range("B4").Value = "OK"
End With
With の後に書いたシートやセルが「省略できる部分」になります。.(ドット)から始めるだけで、同じ対象への処理がまとめて書けます。
まとめ:速いマクロのテンプレート
5つをまとめて使う場合、次のような形をテンプレートとして使い回せます。
Sub 高速マクロのテンプレート()
' 高速化のための設定(最初にまとめてオフにする)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' ここにメインの処理を書く
' 設定を元に戻す(最後に必ず戻す)
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
このテンプレートをベースに処理を書くだけで、動きの遅いマクロを改善できます。新しいマクロを作るときも、最初からこの形にしておくのがおすすめです。
よくある質問
ScreenUpdatingをFalseにしたまま止まってしまったらどうする?
マクロがエラーで途中止まると、True に戻す処理が実行されず、画面が更新されなくなることがあります。
そのときはVBAの編集画面(Alt+F11)を開き、イミディエイトウィンドウに Application.ScreenUpdating = True と入力してEnterを押すと元に戻ります。
5つ全部使わないといけない?
そんなことはありません。
たとえばシートに数式がまったく入っていなければ、自動計算の停止は効果がほとんどありません。まず「画面更新の停止」だけ試してみて、それでも遅い場合に他のものを追加するという進め方でも十分です。
ラーが出て止まったあと、画面が動かなくなったらどうする?
その心配はもっともです。
マクロがエラーで途中止まると、画面更新や自動計算が止まったままになることがあります。そのときはVBAの編集画面(Alt+F11)を開き、イミディエイトウィンドウに以下を1行ずつ入力してEnterを押すと元に戻ります。
Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True
With構文はどんな場面で使うと一番効果的?
同じシートやセル範囲に対して5回以上処理をするときに特に効果的です。たとえば1つのシートの複数セルに値を入れたり、書式をまとめて設定したりするときに使うと、コードがすっきりします。
これをやってもまだ遅い場合は?
5つを試してもまだ遅い場合は、ループの中でセルを1つずつ読み書きしているのが原因であることが多いです。
セルの値を一度配列(値をまとめて入れておける入れ物)に読み込んでから処理する方法に変えると、大幅に速くなることがあります。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



