【ExcelVBA入門】画面の更新を停止して処理を高速化する方法とは

こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。

皆さんは、]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は、処理を書いているうちに重たくなることがよくあります。

コードの書き方を直せば少しずつ速くできるかもしれませんが、長いコードを書いた後に直すのは正直大変ですよね。今回紹介した方法は、手っ取り早く処理を速くすることができるので覚えておくと便利です。ぜひ、使ってみてくださいね!

この記事を書いた人

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

目次