はじめに
Excel VBAは非ITの現場でもよく使われる言語ですが、重い処理をすると処理速度が遅くなってしまうことが良くあります。今回はそんな時に高速化する方法を紹介します。
高速化一覧
更新設定の変更
###ScreenUpdating
処理中に画面の描写を停止することによって処理を速くする事が出来ます。
Application.ScreenUpdating = False
一連の処理が終われば自動的にTrueに戻ります。
Calculation
処理中にSheet上の再計算を止めることによって高速化されます。
Application.Calculation = xlCalclationManual
処理後に自動で戻る事は無いので処理の最後に
Application.Calculation = xlCalclationAutomatic
として自動計算を有効にして下さい。
エラーで落ちた時も自動では戻らないので注意して下さい。
EnableEvents
イベント発生を無効にして高速化します。
無効にすることによってセルのChangeイベント等が発生しなくなります。
Application.EnableEvents = False
Calculation同様に処理終了後にTrueに戻る事は有りませんので注意して下さい
Application.EnableEvents = True
Cursor
カーソルの表示をwaitにすると高速化されます。
(カーソルの変更を判定したり氏なくなって速くなる?)
Application.Cursor = xlWait
これも自動では戻りませんので最後に戻しましょう
Application.Cursor = xlDefault
一括処理
上記は頻繁に使うので纏めてプロシージャにしておくと便利です。
Sub EnableAcceleration()
With Application
.ScreenUpdating = False
.Calculation = xlCalclationManual
.EnableEvents = False
.Cursor = xlWait
End With
End Sub
Sub DisableAcceleration()
With Application
.Calculation = xlCalclationAutomatic
.EnableEvents = True
.Cursor = xlDefault
End With
End Sub
セルへのアクセスを減らす
セルへのアクセスが増えると処理が遅くなるのでセルへのアクセスを極力減らして高速化します。
配列に入れる
一括で配列化する事によりセルへのアクセスが減り処理を高速化出来ます。
Range型をVariant型に代入すると自動では二次元配列として扱われます。
Dim rng As Variant
rng = Worksheets("Sheet1").UsedRange
配列をセルに一括書き込みをする事もできます。
セルへの書き込みは読み込みより重い処理なので特に一括書き込みは有効です。
※但しセル範囲が二次元配列と同じサイズで無くてはなりません。
Dim arr(1 to 2, 1 to 2) As Variant
arr(1, 1) = "foo"
arr(1, 2) = "bar"
arr(2, 1) = "hoge"
arr(2, 2) = "hage"
'これはOK
Worksheets("Sheet1").Range("A1:B2").value = arr
'これはNG
Worksheets("Sheet1").Range("A1:B1").value = arr
変数に入れる
セルに何度もアクセスする場合、変数に代入すると高速化されます
Dim rng As Range
Dim i As Long
set rng = Worksheets("Sheet1").Range("A1")
For i = 1 To 100000
rng.Value = i
Next
但し一回きりの場合は直接アクセスする方が速いです。