無駄な表示を止める
画面の描画は時間のかかる処理です。
たとえば、セルに直接値を代入するだけなら、それはメモリ内での出来事です。しかし、代入した結果を表示するには、画面の描画を更新しなければなりません。これは、セルに値を代入するだけでなく、アクティブセルを移動するときも同じです。アクティブセルは、周囲が太線で囲まれます。アクティブセルを移動するということは、直前の太線を消して、新しく別のセルに太線を表示するということです。もし、画面がスクロールするのなら、行番号や列番号の表示も書き換えなければなりません。Excelのマクロでは、できるだけ不要な画面描画を抑止するのが、高速化のポイントです。
ApplicationオブジェクトのScreenUpdatingプロパティにFalseを設定すると、それ以降の画面描画を抑止されます。今回は、このプロパティによる速度の違いを検証してみます。
Sub Test1()
Dim i As Long
For i = 1 To 5000
Cells(i, 1).Select
Selection = i
Next i
End Sub
Sub Test2()
Dim i As Long
Application.ScreenUpdating = False
For i = 1 To 5000
Cells(i, 1).Select
Selection = i
Next i
Application.ScreenUpdating = True
End Sub
Test1
Test2
%
1回目
6.53 秒
0.33 秒
5.1%
2回目
6.42 秒
0.33 秒
5.2%
3回目
6.56 秒
0.34 秒
5.1%
4回目
6.48 秒
0.33 秒
5.1%
5回目
6.64 秒
0.33 秒
5.0%
6回目
6.77 秒
0.33 秒
4.9%
7回目
6.90 秒
0.33 秒
4.8%
8回目
6.92 秒
0.34 秒
5.0%
9回目
6.84 秒
0.33 秒
4.9%
10回目
6.84 秒
0.33 秒
4.9%
平均
6.69 秒
0.33 秒
5.0%
このように、ScreenUpdatingプロパティで画面の描画を抑止すると、マクロの実行速度は大きく向上します。しかし、上記のTest1は、そもそもSelectしているのがいけません。
Selectした
↓
画面が更新された
↓
時間がかかった
↓
画面の更新を抑止した
↓
実行速度が上がった
ではなく
だけで済む簡単な話です。
Selectについては、次項をご覧ください。