検索速度の測定再び……
前回
ご紹介したように、UsedRange
まわりのExcelの挙動について重大な思い違いをしていたことに気付いた私は、心を入れ替えて実験をし直すことにした。
実験環境の再整備
まず、イミディエイト・ウインドウ上で
Activesheet.Range(Activesheet.Cells(1 ,1),Activesheet.Cells(1000, 1000)).Value = "hoge"
を実行し、
このような環境とした。
続けて、
このように、ALL1000
セルに「ち~んw
」という値(笑)を入力した。
これで、実験環境は整った。
念のために、イミディエイト・ウインドウ上で
?Activesheet.UsedRange.Address
?Activesheet.UsedRange.Count
?Activesheet.UsedRange.Cells.Count
これらのコードを実行し、結果を見てみる。
うむ。UsedRange
プロパティが1000×1000の範囲になっておる!
この状態で、前回記事のリスト1を実行する。
実行結果
まず、
この状態、すなわちALL1001
セルにカーソルを置いた状態で実行してみる。
結果は、
このとおり。
1000×1000のセル範囲のセルのValue
プロパティを一つ一つ調べる方式
5.343
秒。
1000×1000のセル範囲のRange
オブジェクトのValue
プロパティの値を一旦二次元配列にぶち込んで、同じく一つ一つ調べる方式
1.563
秒。
1000×1000のセル範囲に対してExcelのFind
メソッドを使う方式
0.844
秒。
結局、〈総ナメ>2次元配列>Find
メソッド〉という順序は変わっていない。
次に、
この状態、すなわちALL1000
セルにカーソルを置いた状態で実行してみる。
結果は、
このとおり。
1000×1000のセル範囲のセルのValue
プロパティを一つ一つ調べる方式
4.813
秒。
1000×1000のセル範囲のRange
オブジェクトのValue
プロパティの値を一旦二次元配列にぶち込んで、同じく一つ一つ調べる方式
0.906
秒。
1000×1000のセル範囲に対してExcelのFind
メソッドを使う方式
0.891
秒。
やはり、〈総ナメ>2次元配列>Find
メソッド〉という順序は変わっていない。
最後に、
この状態、すなわちA1
セルにカーソルを置いた状態で実行してみた。
結果は、
このとおり。
1000×1000のセル範囲のセルのValue
プロパティを一つ一つ調べる方式
4.797
秒。
1000×1000のセル範囲のRange
オブジェクトのValue
プロパティの値を一旦二次元配列にぶち込んで、同じく一つ一つ調べる方式
1
秒。
1000×1000のセル範囲に対してExcelのFind
メソッドを使う方式
0.921
秒。
やはり、〈総ナメ>2次元配列>Find
メソッド〉という順序は変わらなかった。
おわりに
通常、このようなテストは、何回も繰り返して平均を取るとかするものなので、実験結果に大した意味はないと思いますが、一つ一つのセルにアクセスする方式が論外なのはともかく、2次元配列総ナメ方式とFind
メソッド方式なら、平均すれば2次元配列総ナメ方式が速度面では有利だと思いました。
今回の実験のやり方だと、総ナメ方式には不利(値発見=For
ループ完走なので。)だもんね。