スライドショー

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

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

皆さんは、]VBAで処理を高速化する方法を知っていますか?VBAで処理が遅くなる原因として最も多いのが、「シート移動・並び替え・セル移動などの際に発生する画面更新」です。Application.ScreenUpdatingを使えば、簡単に画面更新を止めることができます。

そこで今回は、

  • 画面の更新を止めて処理を高速化する方法

といった基礎的なことから、

  • 画面更新を止めつつ処理の進捗を確認する方法
  • 更に処理を速くするために覚えておくと便利な小技

といった応用的な方法まで、徹底的に解説します!

結論:画面更新を止めて高速化する方法とは

VBAで画面の処理を止める場合は、Application.ScreenUpdatingを使ってつぎのように書きます。

Application.ScreenUpdating = False

Flaseで画面更新停止、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は、処理を書いているうちに重たくなることがよくあります。

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。
Webアプリ、業務アプリ開発において、要件定義、設計、インフラ、製造、テスト、運用保守など、様々な経験あり。
また、侍ブログ編集部として、これまでに200記事以上の記事を執筆。
現在はフリーランスエンジニア兼テックライターとして活動中。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説