INDEX-MATCH vs VLOOKUP
大論争:INDEX-MATCH vs. VLOOKUP
VLOOKUPはExcelで最も有名な検索関数であり、INDEX-MATCHはそのより強力で柔軟な競合です。この論争は10年以上にわたってExcelフォーラムで激しく続けられてきました。それには十分な理由があります。適切な検索方法の選択は、スプレッドシートの信頼性、柔軟性、パフォーマンスに直接影響するからです。
ネタバレ:Excel 2021または365をお使いなら、XLOOKUPが両方の方法をほぼ時代遅れにしています。しかし、何百万人ものユーザーが依然として古いバージョンを使用しており、INDEX-MATCHから学ぶ原則はすべてのExcel関数に適用できます。XLOOKUPユーザーでさえ、基礎となるメカニズムを理解することで恩恵を受けられます。
ステップバイステップ:VLOOKUPをINDEX-MATCHに変換する
シナリオ:列Dに商品ID、列Aに価格がある商品テーブルがあります。検索列が戻り値列の右側にあるためVLOOKUPは失敗します。INDEX-MATCHが必要です。
ステップ1 — INDEX-MATCHの構造を理解する
- 数式の構造:
=INDEX(return_range, MATCH(lookup_value, lookup_range, 0)) - INDEX(range, row_number) — 範囲内の特定の行位置にある値を返します。
- MATCH(value, range, 0) — 範囲内で値の位置を検索します。0は「完全一致」を意味します。
- 連携動作:MATCHが行番号を検出し、INDEXが戻り値列のその行の値を返します。
ステップ2 — 数式を部品ごとに作成する
- 空のセルで、まずMATCH単体で動作確認します:
=MATCH(A2, D:D, 0)。これによりA2の商品IDが列Dで見つかる行番号が返ります。 - 次にINDEXでラップして価格を取得します:
=INDEX(A:A, MATCH(A2, D:D, 0))。MATCHが見つけた行の列Aから価格が返ります。 - 実運用では範囲を固定します:
=INDEX($A$2:$A$1000, MATCH(A2, $D$2:$D$1000, 0))。計算が遅くなるのを楽しみたいのでなければ、列全体の範囲(A:A)は絶対に使わないでください。
ステップ3 — #N/Aエラーを適切に処理する
- 数式全体をIFERRORでラップします:
=IFERROR(INDEX($A$2:$A$1000, MATCH(A2, $D$2:$D$1000, 0)), "見つかりません")。 - これで、商品IDが検索テーブルに存在しない場合、醜いエラーではなく「見つかりません」と表示されます。
- ダッシュボードでは、よりクリーンな表示のために「見つかりません」の代わりに""(空文字列)を使用します。
VLOOKUPが優位な場合
- シンプルさと可読性。1つのVLOOKUP数式はINDEX-MATCHの組み合わせよりも読みやすく教えやすいです。検索列が左側にある単純な検索では、VLOOKUPの方が記述が速く同僚にも理解しやすいです。
- 素早いアドホック検索。1回限りの検索が必要で、データがすでに検索列を先頭に整理されている場合、VLOOKUPは最も抵抗の少ない方法です。入力して次に進みましょう。
- 近似一致のシナリオ。数値区分(税率区分、コミッション帯、成績評価スケール)では、第4引数にTRUEを指定したVLOOKUPがシンプルでよく文書化されています。
INDEX-MATCHが優位な場合
- 検索列が戻り値列の右側にある場合。VLOOKUPは左から右への検索のみです。INDEX-MATCHは列の順序を気にしません。
- 列の挿入や削除。VLOOKUPのcol_index_numはハードコードされています。列を挿入すると、その列より右側を参照するすべてのVLOOKUPが壊れます。INDEX-MATCHは実際の列参照を使用し正しく調整されます。
- 大規模データセットでのパフォーマンス。INDEX-MATCHはテーブル配列全体をスキャンするのではなく単一列に検索を限定できるため高速です。50,000行を超えると差が顕著になります。
- 双方向(マトリックス)検索。INDEX-MATCH-MATCHはネイティブ機能です:
=INDEX(data_range, MATCH(row_value, row_headers, 0), MATCH(col_value, col_headers, 0))。
よくある間違い
- VLOOKUPが左方向検索できないことを忘れる。これが最大のフラストレーションです。VLOOKUPを使うためだけに列を並べ替えていることに気づいたら、それは間違った戦いをしています — INDEX-MATCHに切り替えましょう。
- VLOOKUPが誤って近似一致を使用する。第4引数は省略するとデフォルトでTRUEになります。FALSEを付け忘れると、正しく見えるが微妙に間違った「それなりに近い」結果が生成されます。常にFALSEを明示的に記述してください。
- INDEX-MATCHでMATCH範囲を固定しない。
=INDEX(D:D, MATCH(A2, B:B, 0))は脆弱です。範囲を固定しましょう:=INDEX($D$2:$D$100, MATCH(A2, $B$2:$B$100, 0))。 - INDEX-MATCHが常に高速だと決めつける。小規模なデータセット(1,000行未満)では、パフォーマンスの差は無視できる程度です。シンプルさがわずかな速度向上に勝ることがよくあります。
応用テクニック
- 動的列選択のためのINDEX-MATCH-MATCH:列名のドロップダウンを作成し、
=INDEX(data, MATCH(row_val, row_col, 0), MATCH(dropdown, headers, 0))。1つの数式がセルフサービス検索ツールになります。 - 最後の出現を取得するINDEX-MATCH:
=INDEX(return_range, MATCH(2, 1/(lookup_range=value), 1))は最初ではなく最後の一致を返します。顧客の最新取引を見つけるのに便利です。 - 複数条件用の配列INDEX-MATCH:
=INDEX(return_range, MATCH(1, (range1=A2)*(range2=B2), 0))をCtrl+Shift+Enterで入力。ヘルパー列なしで複数条件に一致する最初の行を返します。