EXCEL VBAはプログラム実行時にコードを機械語に翻訳するインタプリタ型の言語のため実行速度は遅いと言われます。
確かに軽い処理であれば、速度に問題を感じることが少ないですが、重い処理、ループをして数千から数万行のセルを転記する処理や行の挿入や削除、書式設定をするなど行うと処理速度が著しく低下してVBAは遅いと感じることが多いでしょう。
何時間もかかる処理をせっかく自動化しても重い処理のためパソコンが使えないと利用者の待ち時間につながる可能性があります。
そこで、今回、VBAプログラムで遅いと感じたら覚えておきたい3つの高速化方法を紹介します。
Table of Contents
①セルのリアルタイム更新をOFFにする
VBAでセルの値や書式設定、シートの移動など処理を行うとリアルタイムに画面が更新されます。
この更新処理、数回の更新なら瞬間で終わりますが、数千、何万行のデータを変更する場合に1回は0.1秒の処理でも1万回になれば1000秒と数十分ほどかかります。
画面更新を止めてVBAの実行が完了した時に画面の更新を行えば、その分プログラムの実行速度が高速化します。
コード例
Sub Test()
'画面更新OFF
Application.ScreenUpdating = False
'VBAの処理コード...
'画面更新ON
Application.ScreenUpdating = True
End Sub
処理を始める前に False でOFFにします。
Application.ScreenUpdating = False
VBAの処理が終わったら Trueで画面更新を再開します。
Application.ScreenUpdating = True
②自動計算を止める
EXCELの表の中にたくさんの関数や計算式を使用している場合、ひとつのセルの数値を変更すると他のセルの数値が変わるものが多い場合は画面更新と同じ状況が起こり速度が著しく低下します。
Sub Test()
'手動計算
Application.Calculation = xlCalculationManual
'VBAの処理コード...
'処理の途中でセルの値を更新したい時は
Application.Calculate
'自動計算
Application.Calculation = xlCalculationAutomatic
End Sub
xlCalculationManual(手動)とxlCalculationManual(自動)で切り替えます。
セルの値を途中で更新したい時はApplication.Calculate
Application.Calculate
③イベントを停止する
EXCELの表で「セルの値を変更した」、「セルをクリックした」なイベントが発生した時に操作が行われるイベントプロシージャと呼ばれる関数があります。
こちらも画面更新や自動計算と同じように変更があるたびに処理が行われます。もし、イベント発生時の処理を行わないなら停止させることによって高速化が見込めます。
Sub Test()
'イベント停止
Application.EnableEvents = False
'VBAの処理コード...
'イベント再開
Application.EnableEvents = True
End Sub
False(停止)して処理が終わったら True(再開)して終わります。
さいごに
今回、3つのVBA高速化を紹介しましたが、ひとつ注意点があります。プログラムや関数の間違いや修正時は①リアルタイム更新をONにしないと処理手順が見えなくなりプログラムの間違いが見つけづらくなります。
②自動計算や③イベントをOFFにしたせいで計算が合わなくなったりする場合もありますのでデバック作業時はすべてONにした方が良いと思います。