こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、]VBAで処理を高速化する方法を知っていますか?VBAで処理が遅くなる原因として最も多いのが、「シート移動・並び替え・セル移動などの際に発生する画面更新」です。Application.ScreenUpdatingを使えば、簡単に画面更新を止めることができます。
そこで今回は、
- 画面の更新を止めて処理を高速化する方法
といった基礎的なことから、
- 画面更新を止めつつ処理の進捗を確認する方法
- 更に処理を速くするために覚えておくと便利な小技
といった応用的な方法まで、徹底的に解説します!
結論:画面更新を止めて高速化する方法とは
VBAで画面の処理を止める場合は、Application.ScreenUpdatingを使ってつぎのように書きます。
Application.ScreenUpdating = False
Falseで画面更新停止、Trueで画面更新再開することができます。次のように処理の冒頭で画面更新を止めて、最後に再開することで画面更新せずにメインの処理を実行することができます。
サンプルコード:
Sub Test() '画面更新停止 Application.ScreenUpdating = False 'メイン処理 '画面更新再開 Application.ScreenUpdating = True End Sub
画面更新をとめると無駄な表示がなくなるので、その分処理が高速化するわけですね。処理を速くするだけであれば、この方法だけ覚えておけばOKです。
問題点:処理がどのぐらい進んでいるのかわからない
ただ、先ほどの方法だと画面が完全に止まってしまうため、
- 正しく処理が動いているのかわからない
- どれぐらい処理に時間がかかるのかわからない
といった問題があり、初めて使う人は不安に思ってしまいます。そのため、処理の途中経過を表示する方法も覚えておくのがおすすめです!途中経過を表示するサンプルコードはコチラです。
サンプルコード:
'メイン処理 ' Sub Main() '画面更新ストップ Application.ScreenUpdating = False Call Step1 Call Step2 Call Step3 Call Step4 '画面更新再開 Application.ScreenUpdating = True End Sub Sub Step1() '処理進捗をセルに書き込む時だけ画面更新再開 Application.ScreenUpdating = True ActiveSheet.Range("G2").Value = "実行中 (1/4)" Application.ScreenUpdating = False '以下Step内のメイン処理サンプル Dim i As Integer For i = 0 To 10000 ActiveSheet.Range("G2").Select Next i End Sub Sub Step2() '処理進捗をセルに書き込む時だけ画面更新再開 Application.ScreenUpdating = True ActiveSheet.Range("G2").Value = "実行中 (2/4)" Application.ScreenUpdating = False '以下Step内のメイン処理サンプル Dim i As Integer For i = 0 To 10000 ActiveSheet.Range("G2").Select Next i End Sub Sub Step3() '処理進捗をセルに書き込む時だけ画面更新再開 Application.ScreenUpdating = True ActiveSheet.Range("G2").Value = "実行中 (3/4)" Application.ScreenUpdating = False '以下Step内のメイン処理サンプル Dim i As Integer For i = 0 To 10000 ActiveSheet.Range("G2").Select Next i End Sub Sub Step4() '処理進捗をセルに書き込む時だけ画面更新再開 Application.ScreenUpdating = True ActiveSheet.Range("G2").Value = "実行中 (4/4)" Application.ScreenUpdating = False '以下Step内のメイン処理サンプル Dim i As Integer For i = 0 To 10000 ActiveSheet.Range("G2").Select Next i End Sub
実行結果:
※この例ではG2セルの文字色を事前に赤にしています
Callで実行したStepの処理の冒頭で、進捗状況をG2セルに書き込む処理を書いています。自分で使うツールを作るだけの場合は不要ですが、自分以外の人が使うツールを作る場合は進捗状況がわかるように作っておくのがおすすめです!
補足:合わせて覚えると便利な小技とは
ほとんどの場合画面更新を止めるだけで処理が速くなるのですが、稀に画面更新を止めても速くならないことがあります。画面更新を止めても処理が速くならない場合は、Excelの数式の自動計算が重たい可能性が高いです。
画面更新と同様に自動計算も1行で止めることができるので、合わせて覚えておくのがおすすめです。
自動計算を手動にする方法:
Sub Test() '手動計算に変更 Application.Calculation = xlCalculationManual 'メイン処理 '自動計算に変更 Application.Calculation = xlCalculationAutomatic End Sub
ただ、VBAの処理中に数式の入ったセルの値を使う場合は直前に再計算を入れる必要があるので、こちらも合わせて覚えておきましょう。
Application.Calculate
Excelの数式がありすぎて重たくなっている場合などに特におすすめなので、覚えておくと便利ですね。
まとめ
今回は、画面の更新を止めて処理を高速化する方法について解説しました。VBAは、処理を書いているうちに重たくなることがよくあります。
コードの書き方を直せば少しずつ速くできるかもしれませんが、長いコードを書いた後に直すのは正直大変ですよね。今回紹介した方法は、手っ取り早く処理を速くすることができるので覚えておくと便利です。ぜひ、使ってみてくださいね!