2010年6月23日水曜日

EXCELVBAの性能改善

EXCELマクロで、ワークシートに文字列を書き込むときの性能についてです。
実際ぶち当たったのですが、なぜか6セル分を書き込むだけで3秒程度かかる事象が起きました。
はっきりとした原因は不明なのですが、おそらくデータのあるセル範囲(アクティブレンジ)が多すぎると、書き込みに時間がかかるようです。
※ScreenUpdatingやAutoCalculate等は当然OFFにして実行しています。

対策として以下のようにしました。

・改修前(遅いパターン)
for i = 1 to 10
for j = 1 to 10
Cells(i,j).value=cstr(i+j)
next j
next i

・改修後
dim values(10,10) as variant
for i = 0 to 9
for j = 0 to 9
values(i,j) = cstr(i+j)
next j
next i

Range(Cells(1,1),Cells(10,10)).value2 = values
改修後は、毎回セルに値を設定するのではなく、2次元配列に値を設定しておき、配列をセル(レンジ)に一回で設定する。というものになります。

これにより性能が約100倍くらい早くなりました。(※処理によります)
推測ですが、WorkSheetオブジェクトのCellsプロパティやRangeプロパティは実は時間がかかる処理なのかもしれません。索引を使っているだろうから早いと思っていたのに…。

0 件のコメント:

コメントを投稿