VBA高速化検証:オブジェクト変数 2011.09.21
変数にオブジェクトを格納する際に使用するのがオブジェクト変数です。セルはRange型、ワークシートはWorksheet型など、オブジェクトごとに型はありますが、全てのオブジェクトを格納できるObject型もあります。一般的には、オブジェクトに適した型に格納することが推奨されています。
今回は、全てのオブジェクトに対応しているObject型とオブジェクトに適した型、そしてなんでも格納できるVariant型の速度面での比較検証を行いました。尚、Excel2003と2007で検証を行っています。
Set ステートメントを用いての速度比較
オブジェクトは、Setステートメントを用いオブジェクト変数に格納します。次の検証は、Object型、Range型、Variant型にセル範囲を設定した速度比較です。また、設定したオブジェクト変数にWithステートメントを併用した検証も併せて載せてあります。
下の表とグラフは、私のパソコン※でスピード検証テストを行った結果です。
※Vista / intel Core2 Duo / Excel2003,2007
結果
・Excel2003と2007では、どのケースでも2003が高速であった
・Range型が最も高速であった
・Withステートメントを使用した場合でも、Range型が最も高速であった
結果から
オブジェクト変数は、Setステートメントを用いる場合、オブジェクトごとの個別の型に格納するのが良いようです。そうすることで、メソッドやプロパティが表示されるメリットもあるため、極力そうすることを推奨します。
For Each ~ Next でのオブジェクト変数
次に、オブジェクト変数を For Each ~ Next 内で使用するケースの検証を行いました。オブジェクトのプロパティを取得しない場合と、1~3回取得するケースで検証を行っています。
尚、For Each ~ Next 内ではSetステートメントは使用しません。
結果
・Excel2003と2007では、どのケースでも2003が高速であった
・オブジェクトのプロパティを取得する場合は、個別のオブジェクト型が最も高速であった
・オブジェクトのプロパティを取得しない場合は、Object型が最も高速であった
結果から
For Each ~ Next 内のでも、オブジェクト個別の型を使用する方が良いようです。ただ、オブジェクトのプロパティ取得・設定しない場合は、Object型が最も高速であることを覚えておくのも良いでしょう。
※今回のテストは私のパソコンのみの検証であり、どのような環境でも、同様の結果を保証するものではありません。
※Excelのバージョンで結果に違いが出る事が考えられます。
検証テストコードとファイル
●検証テストのコード [Code]
●Excel97-2010 [Test_File] 検証テストを行ったファイルです。