2次元配列を検索する方法4選
前回の1次元配列の検索では、ワークシート関数のVLOOKUP関数が圧倒的に速いことがわかりました。
しかし、セルは行×列で成り立っているので、2次元配列で検証しなければ、本来の検証とは言えません。
2次元配列の検索も、1次元配列のときと同様に、次の4つの方法で検証を行います。
- セルをループさせる(For)
- セルをループさせる(For Each)
- Findメソッドを使用する
- ワークシート関数(VLookup関数、HLOOKUP関数)を使用する
今回の検証では、250×250の2次元配列で検証をしてみます。
ぜひ1次元配列のときの結果と見比べてみてください。
セルのループ(For) サンプルプログラム
1次元配列のときと違い、ループが2重に回されています。
セルのループ(For Each) サンプルプログラム
For Each構文を使用した検索では、1次元配列のときの検索方法と違いはありません。
"検索範囲"の指定を、[A1:C5]のようにセル範囲にするだけで、2次元配列の検索が可能となります。
Findメソッド サンプルプログラム
Findメソッドを使用した検索でも、For Each構文を使用した検索のときと同様に
範囲の指定を変えるだけで、2次元配列の検索が可能となります。
ワークシート関数(VLOOKUP関数、HLOOKUP関数) サンプルプログラム
VLOOKUP関数は、縦方向一列にしか検索を行わないので、Offsetメソッドを使いループさせています。
検証
さて、1次元配列の検索では、VLOOKUP関数が圧倒的でしたが、2次元配列ではどうでしょう。
実行結果は以下の通りです。
回数 | For | For Each | Findメソッド | ワークシート関数 |
---|---|---|---|---|
1回目 | 1.578 | 0.453 | 0.125 | 0.734 |
2回目 | 1.563 | 0.422 | 0.031 | 0.485 |
3回目 | 1.594 | 0.156 | 0.032 | 0.453 |
4回目 | 1.625 | 0.484 | 0.016 | 0.454 |
5回目 | 1.594 | 0.453 | 0.047 | 0.078 |
6回目 | 1.531 | 0.016 | 0.015 | 0.032 |
7回目 | 1.593 | 0.406 | 0.032 | 0.328 |
8回目 | 1.516 | 0.156 | 0.015 | 0.203 |
9回目 | 1.485 | 0.312 | 0.109 | 0.250 |
10回目 | 1.563 | 0.406 | 0.062 | 0.438 |
平均 | 1.564 | 0.326 | 0.048 | 0.346 |
結果は歴然です。
『Findメソッドが圧倒的に速い』ことがわかります。
一般的なプログラムでは、ループ回数が多くなればなるほど、実行速度は遅くなります。
For構文や、VLOOKUP関数を使用した検索方法では、行数や列数により実行速度が左右されます。
その点、Findメソッドは左右されません。(むしろ2次元配列の方が速いです。)
余談ですが、VBAプログラマはなぜか自作ロジックを作るのが大好きな人が多い気がします。
JAVAプログラマは自作ではなく、いかに部品を組み合わせるかを重視するように感じます。
VBA内部には優秀な部品が、実はたくさんあります。
大事なのはその優秀な部品がどれかを見極め、それを使いこなすことだと私は思っています。
Cellsプロパティをループさせることは卒業して、Findメソッドを使用するようにしましょう。
1次元配列での検証結果は、こちらを参照ください。