動作のスピードを上げるには
マクロを構築する上で、処理するデータ量が多くなると必ずと言っていいほど、ぶち当たる壁が「動作が重くなる」ということです。
もちろん、結果が同じでも途中の動きが異なる場合には、マクロのVBAコード自体も全く別なものになりますが、できる限り負荷が少ないように作成するのが定石です。
とはいえ、多少なりともスピードを上げるには、次のような動作をするコードを入れるのも一つの方法です。
1.画面の遷移(移動)を停止する
2.数式の動作を停止する
3.警告を停止する
画面の遷移(移動)を停止する
マクロを実行する際、画面の遷移(例えば、他のセルやシートを選択する動作)をオンにしたままだと、動作に余分な負荷がかかり、結果として、マクロ全体の動作が遅くなってしまいます。
そこで、マクロ動作中は画面遷移を一時的に停止させるのが基本です。これにより、余計な処理が省かれ、全体の動作スピードが向上します。
ただし、マクロの実行中に動きを見ながら確認したいという場合は、画面遷移を動作させてください。
マクロ実行中に画面遷移を停止するには、以下のコードを使用します。
Application.ScreenUpdating = False
Application: Excel全体を指します。
ScreenUpdating: 画面の更新(遷移など)を管理するプロパティです。
False: 更新を停止する指定です。
通常、このコードはVBAコードの一番初めに記述し、画面遷移をオフにします。そして、処理が終わった後には、以下のコードで画面遷移を再開します。
Application.ScreenUpdating = True
このように、停止と再開のコードをセットで記述するのが一般的です。これにより、画面遷移による余計な負荷を防ぎ、マクロの動作速度を向上させることができます。
数式の動作を停止する
Excelシートに含まれる数式とは、四則演算(+、-、×、÷)や関数(SUM、VLOOKUPなど)があります。シート上にこの数式の数が多いほど、マクロを実行する際に「何度も再計算」が行われるため、動作が重くなる原因になります。
そのため、マクロを動かす場合は、数式の再計算を一時的に停止することをお勧めします。
ただし、注意が必要で、マクロの動作の一部として、シート内の関数の計算結果を必要とする動作を組み込んでいる場合、この停止の動作を入れてしまうと、マクロが動いている間は計算がされないので、停止する前の「結果」を元に動作してしまいます。
マクロを動かし、何かしら数値が変わった状態で、「シート上の関数を動かした上」で、その後のマクロを動作せたい場合には、「一次的に停止を解除する」か「そもそもこの停止動作を使用しないか」事前に検討が必要です。
また、数式に関しては、「停止」「再開」とお話をしましたが、実際には「手動」か「自動」の選択になり、手動の場合には「保存した際に再計算を行うか」「特定のボタンを押すと再計算するか」を設定できます。
「自動」の場合には、数値が変わるたびに計算されます。
なお、マクロ実行中に数式の再計算を「手動」に切り替えるには、以下のコードを使用します。
Application.Calculation = xlManual
Application: Excel全体を指します。
Calculation: 数式の計算に関する設定です。
xlManual: 再計算を「手動」に切り替える指定です。
厳密に言うと、これは再計算を「停止」するのではなく、数式の再計算を「自動」から「手動」に設定変更している状態です。
そのため、マクロの動作が終わった後には、必ず以下のコードで再計算を「自動」に戻しておく必要があります。
Application.Calculation = xlAutomatic
これを忘れると、通常の作業中でも数式が自動で更新されず、誤った資料になる危険性があります。
「手動」に切り替えた場合には「自動」に戻すことを忘れないようにしましょう。
警告を停止する
マクロを実行する際、シートを削除するなどの操作で、以下のような警告メッセージが表示されることがあります。
「このシートを削除すると、元に戻せません。続けますか?」
マクロ動作中にこのような警告が表示されると、毎回手動でクリックやEnterキーを押す必要が生じるため、自動化の意味がなくなってしまいます。
押さなくてもいいようにするには、この表示自体を「表示させない」ように、マクロ動作中は警告を一時的に停止させることで、表示しなくすることがでいます。
Application.DisplayAlerts = False
Application: Excel全体を指します。
DisplayAlerts: 警告メッセージの表示を制御するプロパティです。
False: 警告を停止します。
ただし、マクロの動作が終わっても警告を停止したままにすると、重要なメッセージに気付かないリスクがあります。
そのため、マクロの処理が完了したら、以下のコードを記述して警告を再開することが必要です。
Application.DisplayAlerts = True
このように、停止と再開をセットで記述することで、マクロの動作中は停止、動作後は再開することで、マクロ動作中に止まることがないようにすることができます。
まとめ
今回説明した3つの設定については、マクロ全体に適用することが多いので、次のように記述することが多いです。
・コードの一番初めに「停止」や「手動」の設定を記述
・コードの一番最後に「動作(再開)」や「自動」設定を記述
これにより、マクロ全体で動作を早くする処理が可能になります。
一方で、一部の処理だけに適用したい場合には、必要な範囲内にのみ「停止」や「手動」のコードを記述します。この場合、停止の影響はその範囲内に限定されます。
注意点として、停止設定を解除しないままだと、通常の作業時に不具合が発生する可能性があります
そのため、最後には必ず「再開」や「自動」のコードを記述し、元の設定に戻すようにしましょう。
コメント