VBAの高速化(Selectでのセル選択を行わない)

RangeプロパティやCellsプロパティでセルを参照する際に、そのセルをSelectメソッドで選択することがあります。

選択しておいて、ActiveCellオブジェクトに対する各種メソッドやプロパティでの処理を行う場合などですね。

しかし、Selectをせずとも対象セルのメソッドやプロパティは利用可能です。

また、Selectをするのとしないのとではかなりの処理速度の差があります。

不要であればSelectは使わない

結論から言うと、Selectを使わない方が処理速度が速くなります。

それも、劇的に速くなります。

例えば、セルの値を参照するためにValueプロパティを使うことはよくある処理ですが、その際にセル選択のSelectをせずに直接Valueプロパティを利用すると処理速度が速くなります。

他の処理速度方法ではコードが長くなったり、可読性が落ちるなどの弊害も出てくることがあるのですが、この改善方法はコード量も減りますし、可読性も低下しません。

テストコードで検証

以下のソースで実測してみました。

10000回セルの参照を行うテストです。

1つはSelectを行ってValueを取得するパターンで、もう1つはSelectを行わずにValueを取得するパターンです。



検証結果

上記のテストコードの実行結果は以下の通りです。

Selectあり:3.8466796875秒
Selectなし:0.0380859375秒

数値上はSelectの有無で100倍以上の差があることが分かりますが、100倍というよりも、直接Valueで指定すると即時処理が終わっている、と見た方がいいでしょうね。

Selectすると遅い理由

Selectすることで遅くなる理由は、画面描画やイベント処理に時間が掛かっていることと、ActiveCellオブジェクトなどの選択セルの状態の書き換えに時間が掛かることが原因と思われます。

以下は画面描画などのApplication.ScreenUpdatingなどを無効にした場合のテストコードです。

実行結果
Selectあり:0.236328125秒
Selectなし:0.041015625秒

確かにApplicationのプロパティを無効にすると速くはなりますが、それでもActiveCellの書き換えを行う分、Selectしている方が遅いです。でもまあここまでくればOKでしょうけどね。

関連記事

サブコンテンツ

このページの先頭へ