今日は「マクロの記録」で出来た「マクロ」を実行する際に、以前の記事で修正方法を少し解説しました。それでも実際に動かしてみると、データを書き換えている時や、シートが変わる時に画面が動いているのが見えたでしょ?
そうですね。動いてますね! 早いからあまりよくわからなかったんだけどよく見ると動いているのがわかります。
修正の記事のおさらいはこちらの記事です(^^)/ 下のカードをクリックすれば開きます
前回記事でわかったこと
・「実行時エラー」の対処方法がわかりました
・デバッグの基礎的な方法がわかりました
・新しいプロシージャをつくって「ボタン」に登録する方法がわかりました
【この記事でわかること】
・マクロ(VBA)実行時の動作をスピードアップする方法がわかります
・スピードアップ設定前後の動作画像を確認できます
この記事で使用したサンプルファイルはこのリンク先からダウンロードできます
ExcelVBA(マクロ)実行時に画面が動く
マクロ実行時に画面が動くのはなぜだったでしょうか? おさらいしましょう
「マクロの記録」は「操作者のエクセル操作を記録し、マクロのプログラムに変換してくれる機能」です。だからそのまま実行すると「操作者のエクセル操作」がそのまま再現されるんだよね。ということは、セルやシートを選択したりする操作のとおりに画面が動いちゃうんですよね
ExcelVBA(マクロ)を最適化しよう
マクロ実行中のパフォーマンスを改善する方法は意外と簡単にできるのでその方法を紹介していきます
「Application.ScreenUpdating」で画面が動かないようにしよう
マクロ実行時の、セル操作、書式設定やシートの表示切替などの処理では、その都度画面が切り替わります。これは「画面の再描画」が都度発生しているため、多くリソースを消費するので処理が遅くなる原因となっています
「ScreenUpdating」は「Applicationオブジェクト」のプロパティです。名前のとおり、画面更新のプロパティです。このプロパティに「False」を設定して画面更新をオフにすることで、描画のチラつきを抑えることが出来ます。その結果、処理が高速化されます
Sub マクロ連続実行()
Application.ScreenUpdating = False
'~この間に実際の処理が入ります~
Call Macro1
Call Macro2
Call Macro3
Call Macro4
Call Macro5
Application.ScreenUpdating = True
End Sub
最後に「Application.ScreenUpdating = True」を入れています。「True」に戻さないと再描画しないままの状態になってしまいますので必ず指定します。 こんな感じです(^^)
「Application.Calculation」で再計算を停止しよう
既定ではシートの再計算は自動になっているため、シートに数式がある場合はセルが変更される度に再計算が行われ処理速度の低下に繋がります
「Calculation」も「Applicationオブジェクト」のプロパティです。名前のとおり、計算のプロパティです。このプロパティに「手動計算」の定数「xlCalculationManual」を設定して再計算しないようにすることで、処理が高速化されます
これも先ほどと同じように処理終了時に「自動計算」の定数「xlCalculationAutomatic」を設定する必要があります。「自動計算」にした時点でシートの再計算が実行されます
Sub マクロ連続実行()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationAutomatic
'~この間に実際の処理が入ります~
Call Macro1
Call Macro2
Call Macro3
Call Macro4
Call Macro5
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = True
End Sub
ただし、途中で計算しなければならないケースの場合「xlCalculationAutomatic」で自動計算にするのではなく、次のように最低限の範囲で計算させるようにします
'指定したセル範囲だけ計算させる場合の例
ActiveSheet.Range("A1:K20").Calculate
'シートを指定して計算させる場合(この例ではActiveシート)
Application.Calcule
'ブック全体で計算を実行(ただし手動実行なので自動計算はそのまま)
ActiveSheet.Calculate
「Application.EnableEvents」でイベント発生を抑止しよう
「イベント」って何? って思いますよね(^^)
イベントはブックやシートを操作したりするときに発生しています。例えばシートがアクティヴになった時「Active」イベント、セルに入力後に変化があったので「Cange」イベントが発生しています。マクロ内にあればその都度イベントが発生して処理速度に影響を与えています
「Applicationオブジェクト」の「EnableEvents」プロパティでそのイベント発生を抑止することが出来ます。「False」を設定すればイベントの発生を停止して処理を高速化できます
Sub マクロ連続実行()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = False
'~この間に実際の処理が入ります~
Call Macro1
Call Macro2
Call Macro3
Call Macro4
Call Macro5
Application.EnableEvents = True
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = True
End Sub
これも処理終了時に必ず「True」に戻してイベントを再開させておきます
動作確認のためテストしてみましょう
それでは、動作確認のテストをやってみましょう。途中でエラーが発生しても止まらないようにコードを追加して実行してみます。追加したコードは「On Error Resume Next」と「On Error GoTo 0」です
テストしたコードとシート設定
Sub 最適化してマクロ連続実行()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = False
'~この間に実際の処理が入ります~
On Error Resume Next 'エラーを無視させます
Call Macro1
Call Macro2
Call Macro3
Call Macro4
Call Macro5
On Error GoTo 0 'エラー処理を戻す
Application.EnableEvents = True
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = True
End Sub
Sub 最適化なしでマクロ連続実行()
On Error Resume Next
Call Macro1
Call Macro2
Call Macro3
Call Macro4
Call Macro5
End Sub
テスト画像を比較してみてください
・最適化なしで実行した動画
・最適化して実行した動画
どうですか。違いがわかりますか(^^)
最適化しない場合は「ボタン」が消えたりとか動きが騒がしいよね。それに比べて下の動画は最適化したので一瞬で終わっちゃう感じでしょ(^^♪
ほんとだ! こんなに違うんですね!
記録したまま修正しなくてもスピードアップできそうですね(^^)
今回紹介した最適化は汎用的に使えるので、コードの書き方なども含めて次の記事でもう一度紹介しますね(^^)/
・今回はここまでで終了です!
・この続きは次回の記事まで少しお待ちください・・・・
・ご期待くださ~い(^^)/
まとめ(おわりに)
まとめと感想など
・マクロ(VBA)実行時の動作をスピードアップする方法がわかりました
「Application.ScreenUpdating」で画面描画抑止
「Application.Calculation」で再計算を停止
「Application.EnableEvents」でイベント発生抑止
・スピードアップ設定前後の動作を確認できました
・マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください!
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
今後の記事について
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は今回の記事に続き「初心者向けマクロ」の記事を継続して書いていきます
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にご期待ください(^^)/