検索速度の測定再び……
前回
ご紹介したように、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ループ完走なので。)だもんね。