INDEX関数とMATCH関数を使った高速検索術

INDEX関数とMATCH関数を使った高速検索術 IT
  1. まず押さえる!INDEX関数・MATCH関数で「速く探せる」理由
    1. 理由1:左端縛りがない=探し方の自由度が高い
    2. 理由2:列追加・列移動に強く、メンテが速い
    3. 理由3:「必要な場所だけ見に行く」発想で無駄が減る
  2. 最速の基本形:INDEX×MATCHの鉄板テンプレ(縦・横・2次元)
    1. 1)縦方向(列から探して別列の値を返す)
    2. 2)横方向(行から探して別行の値を返す)
    3. 3)2次元(行×列で交点を返す)
  3. 実務で効く応用:複数条件・部分一致・エラー処理で“使える検索”にする
    1. 1)複数条件(社員ID×年月、商品×店舗…)で探す
    2. 2)部分一致(「含む」で探す)をINDEX×MATCHでやる
    3. 3)エラー処理(#N/Aを“見せない”)で資料が崩れない
  4. さらに高速&堅牢に:検索範囲設計とテーブル活用、XLOOKUP/VLOOKUPとの比較
    1. 1)まずやる:列全体参照をやめて“必要最小限”に絞る
    2. 2)テーブル(Ctrl+T)で“伸びる範囲”を標準装備にする
    3. 3)“壊れにくさ”を上げる固定のコツ(絶対参照・列参照の統一)
    4. 4)XLOOKUP/VLOOKUPとどう使い分ける?(結論:目的で選ぶ)
  5. 今日から使うための実践例:売上表・名簿・案件管理での時短パターン集
    1. パターン1:売上表(商品×月の交点)をワンショットで返す
    2. パターン2:名簿(社員ID→部署/内線/メール)を“一括で埋める”
    3. パターン3:案件管理(担当者×ステータス×期限)で「該当行の情報」を引く
    4. パターン4:運用で差がつく“小さな型”

まず押さえる!INDEX関数・MATCH関数で「速く探せる」理由

Excelで「欲しいデータを探す」とき、真っ先に思い浮かぶのがVLOOKUP関数かもしれません。ですが実務では、VLOOKUPが遅い・壊れやすい場面がわりと多いです。そこで覚えておきたいのが、INDEX関数+MATCH関数の組み合わせ。これは単なる代替ではなく、検索を“速く・安定して”回すための定番テクです。

まず役割をざっくり整理するとこうです。

  • MATCH関数:探したい値が「何番目にあるか(位置)」を返す
  • INDEX関数:指定した「位置」のセルを返す

つまり、「場所を特定する(MATCH)」→「その場所から取り出す(INDEX)」という2段構え。これがなぜ速いのか、理由は主に3つあります。

理由1:左端縛りがない=探し方の自由度が高い

VLOOKUPは「検索列が範囲の一番左にないといけない」という制約があります。だから実務では、列の順番を入れ替えられない表に対して、ムリに範囲をいじったり、別列を作ったりして対応しがちです。これが積み重なると、ファイルが重くなる・運用が崩れる原因になります。

一方でINDEX×MATCHは、検索列と取得列を別々に指定できます。列構成を変えずに検索できるので、余計な加工が減り、シートの設計がシンプルになります。

理由2:列追加・列移動に強く、メンテが速い

VLOOKUPは「何列目を返すか」を列番号で指定します。たとえば「3列目」を返す設定にしていたのに、途中に列が1本増えたら、返す列がズレることがあります。地味ですが、こういう事故のチェックと修正が意外と時間を食います。

INDEX×MATCHは、取得したい列を範囲として直接指定します。列が増えても、参照している列そのものが変わらなければ壊れにくい。結果として、修正に追われる時間が減り、仕事が速く回ります。

理由3:「必要な場所だけ見に行く」発想で無駄が減る

大量データ(数万行など)になると、検索系の式が重くなりがちです。INDEX×MATCHは、位置を求めてから、そこだけを取りに行くので、設計次第で軽くできます。特に、参照範囲を必要最小限に絞る・列全体参照を避けるだけでも体感が変わります。

なお、「INDEX×MATCHにしただけで必ず爆速になる」というより、壊れにくさと設計の自由度が上がることで、結果的に速く運用できるのが本質です。20代の会社員のうちは、まず“正確に早く出す”が評価に直結します。検索が安定すると、集計・チェック・共有までの流れが一段ラクになります。

次章では、実務でそのまま使えるINDEX×MATCHの鉄板テンプレを、縦方向・横方向・2次元(行と列の両方)に分けて紹介します。

最速の基本形:INDEX×MATCHの鉄板テンプレ(縦・横・2次元)

INDEX×MATCHは、「MATCHで位置を出す」→「INDEXで取り出す」だけ。まずはこの基本形をテンプレとして手元に置くと、検索作業が一気に安定します。ここでは実務で出番の多い縦(列検索)横(行検索)2次元(行×列)の3パターンを押さえます。

1)縦方向(列から探して別列の値を返す)

いちばん使う形です。たとえば「社員IDから氏名を返す」など。

テンプレ

=INDEX(返したい列, MATCH(探す値, 検索する列, 0))

:A列に社員ID、B列に氏名がある。セルE2のIDから氏名を返したい。

=INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0))
  • MATCH(E2,$A$2:$A$100,0)で「何行目か」を特定(0は完全一致
  • その行番号を使って、INDEXがB列から氏名を取り出す

ポイントは、MATCHの第3引数をまずは0固定にすること。これで「だいたい一致」や並び順の罠を避けられます。

2)横方向(行から探して別行の値を返す)

月別の表など、横に並んだ見出しから値を取るケース。

テンプレ

=INDEX(返したい行, MATCH(探す値, 検索する行, 0))

:2行目に「1月〜12月」、3行目に売上。セルE2の「月」から売上を返す。

=INDEX($B$3:$M$3, MATCH(E2, $B$2:$M$2, 0))

縦と同じ考え方で、「どの列か」をMATCHで出してから、INDEXで返します。VLOOKUPで無理やり横検索するより、式の意味が読みやすいのもメリットです。

3)2次元(行×列で交点を返す)

「商品×月」「社員×案件」など、表の交点から値を取りたいときの鉄板。ここまでできると、検索のストレスが一段減ります。

テンプレ

=INDEX(表全体, MATCH(行の探す値, 行見出し列, 0), MATCH(列の探す値, 列見出し行, 0))

:A列に商品名、1行目に月、B2:M100が売上表。
セルP2の商品×セルQ1の月の売上を返す。

=INDEX($B$2:$M$100, MATCH(P2, $A$2:$A$100, 0), MATCH(Q1, $B$1:$M$1, 0))
  • 1つ目のMATCHが「何行目(商品)」
  • 2つ目のMATCHが「何列目(月)」
  • INDEXが表の中から交点の値を返す

この2次元テンプレを覚えると、表の形が多少変わっても「行見出し」「列見出し」を差し替えるだけで対応できます。まずはこの3つを丸ごとコピペできる状態にしておくと、検索作業が“毎回考える仕事”から“流し作業”になります。

実務で効く応用:複数条件・部分一致・エラー処理で“使える検索”にする

基本テンプレが組めるようになったら、次は「現場でつまずく3点セット」を潰します。つまり、複数条件部分一致エラー処理。ここを押さえると、検索式が“動く”だけでなく、運用に耐える形になります。

1)複数条件(社員ID×年月、商品×店舗…)で探す

実務の検索は「IDだけ」みたいに単純なことが少なく、2つ以上の条件が揃った行を探したいケースが頻出です。おすすめは、MATCH側で条件を掛け算して「両方TRUEの行=1」だけを探す方法です。

:A列=社員ID、B列=年月、C列=金額。E2の社員IDとF2の年月に一致する金額を返したい。

=INDEX($C$2:$C$100,
  MATCH(1, ($A$2:$A$100=E2)*($B$2:$B$100=F2), 0)
)
  • ($A$2:$A$100=E2)($B$2:$B$100=F2) は一致した行だけTRUE
  • 掛け算すると、両方一致した行だけ 1 になり、MATCHがその位置を返す

※Microsoft 365などの動的配列対応Excelならそのまま入ります。古いExcelで動かない場合は、数式バーで入力後、Ctrl+Shift+Enter(配列数式)になることがあります。

2)部分一致(「含む」で探す)をINDEX×MATCHでやる

「案件名に“保守”が入っている行」「メール件名に特定ワードが含まれる」など、完全一致では拾えない検索も多いです。部分一致は、MATCHの検索値にワイルドカード(*)を足すのが手早いです。

:A列=案件名、B列=担当者。E2のキーワードを含む案件の担当者を返したい。

=INDEX($B$2:$B$200, MATCH("*"&E2&"*", $A$2:$A$200, 0))

これで「E2の文字列を含む最初の行」を返します。なお、複数ヒットのうち最初の1件だけになる点は仕様です(一覧で全部抜きたいならFILTER関数など別アプローチ)。

3)エラー処理(#N/Aを“見せない”)で資料が崩れない

検索の弱点は「見つからない」ときに#N/Aが出て、見栄えも後工程も壊れること。たとえば集計表や報告資料では、#N/Aが1つあるだけで一気に“未完成感”が出ます。

基本はIFERRORで包むだけ。

=IFERROR(
  INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0)),
  "該当なし"
)

「該当なし」でもいいですし、空欄にしたいなら "" を返すのもアリです。

ここまでの3つ(複数条件・部分一致・エラー処理)をセットで使えるようになると、検索式が“個人の小技”から“チーム運用の道具”に変わります。次章では、さらに速く・壊れにくくするための検索範囲の設計テーブル活用、そしてXLOOKUP/VLOOKUPとの使い分けを整理します。

さらに高速&堅牢に:検索範囲設計とテーブル活用、XLOOKUP/VLOOKUPとの比較

INDEX×MATCHを「使える」から「速くて壊れない」に引き上げる鍵は、式そのものより参照範囲の設計です。ここを雑にすると、数式は正しくてもブックが重くなり、修正にも弱くなります。

1)まずやる:列全体参照をやめて“必要最小限”に絞る

$A:$A$B:$Bのような列全体参照は便利ですが、検索が大量に並ぶと計算負荷が上がりがちです。特に数万行データ×何百セルの検索だと、体感で固まります。

  • データが1000行までなら $A$2:$A$1000 のように上限を切る
  • 「入力行が増える」運用なら、次のテーブル化で自動追従させる

2)テーブル(Ctrl+T)で“伸びる範囲”を標準装備にする

おすすめは、検索対象の表をテーブル化して、構造化参照で書く方法です。行が増えても参照範囲が自動で伸びるので、上限を見誤って「検索漏れ」する事故を防げます。

たとえばテーブル名をtbl社員、列が社員ID氏名なら、式はこう書けます。

=IFERROR(
  INDEX(tbl社員[氏名], MATCH(E2, tbl社員[社員ID], 0)),
  "該当なし"
)

セル範囲より意味が読みやすく、引き継ぎでも強いのが地味に効きます。

3)“壊れにくさ”を上げる固定のコツ(絶対参照・列参照の統一)

検索式を横や下にコピーする前提なら、検索範囲は絶対参照($)で固定、検索値だけ相対参照にするのが基本です。さらに、検索列と返す列の「開始行」を揃える(どちらも2行目開始など)と、後からの修正でズレにくくなります。

4)XLOOKUP/VLOOKUPとどう使い分ける?(結論:目的で選ぶ)

  • VLOOKUP:古い環境でも通るが、列番号指定&左端縛りでメンテが弱い。小規模・単発ならアリ。
  • XLOOKUP:今いちばん書きやすい。検索方向の自由、未一致時の戻り値指定などが強い。使える環境(Microsoft 365等)なら第一候補。
  • INDEX×MATCH:互換性が高く、2次元検索や複数条件など「設計で強くする」余地が大きい。既存資産(過去ファイル)との相性も良い。

実務のおすすめは、新規で365前提ならXLOOKUP、共有・引き継ぎ・2次元や応用込みならINDEX×MATCH。そしてどちらを使っても、最後に効いてくるのは参照範囲を絞る/テーブル化するという設計です。速さは関数より、設計で決まります。

今日から使うための実践例:売上表・名簿・案件管理での時短パターン集

テンプレや設計のコツを押さえたら、あとは「自分の業務に当てはめて反復」が最短です。ここでは20代のサラリーマンが触れがちな定番データ(売上表・名簿・案件管理)で、今日からそのまま使える時短パターンをまとめます。

パターン1:売上表(商品×月の交点)をワンショットで返す

月次の売上確認で「この商品、今月いくら?」を毎回目視で探すのは地味に時間泥棒。2次元のINDEX×MATCHで一発にできます。

:A列=商品名、1行目=月、B2:M100=売上。P2に商品名、Q1に月が入っている。

=IFERROR(
  INDEX($B$2:$M$100, MATCH(P2, $A$2:$A$100, 0), MATCH(Q1, $B$1:$M$1, 0)),
  ""
)
  • 営業報告や会議前のチェックが「探す」→「入力して確認」に変わります
  • 見出し(商品名・月)さえ揃っていれば表の形が多少変わっても修正が軽いです

パターン2:名簿(社員ID→部署/内線/メール)を“一括で埋める”

人事名簿や連絡網は「社員IDから必要情報を引く」だけで作業の大半が終わります。列を増やしても、INDEXの参照先を変えるだけなので壊れにくい。

:A列=社員ID、B列=氏名、C列=部署、D列=メール。E2に社員ID。部署を返す。

=IFERROR(
  INDEX($C$2:$C$1000, MATCH(E2, $A$2:$A$1000, 0)),
  "未登録"
)

同じMATCH部分を使い回せるので、氏名はB列、メールはD列…と横にコピーして“名簿が自動で埋まる”状態を作れます。

パターン3:案件管理(担当者×ステータス×期限)で「該当行の情報」を引く

案件表は条件が複数になりがちです。例えば「担当=自分」かつ「ステータス=進行中」の案件の期限だけ抜きたい、など。

:A列=案件ID、B列=担当者、C列=ステータス、D列=期限。
F2=担当者、G2=ステータスに一致する期限を返す(最初に見つかった1件)。

=IFERROR(
  INDEX($D$2:$D$2000,
    MATCH(1, ($B$2:$B$2000=F2)*($C$2:$C$2000=G2), 0)
  ),
  ""
)
  • 朝イチの優先順位付けが速くなり、抜け漏れ防止にも効きます
  • 「最初の1件」仕様なので、一覧化したい場合は別手段(FILTER等)を検討

パターン4:運用で差がつく“小さな型”

  • 検索結果は基本空欄:報告書は見た目が命。IFERROR(...,"")で崩れを防ぐ
  • 入力セルを固定化:商品名や社員IDをプルダウンにすると、表記ブレで検索が死ぬ事故が減る
  • 参照範囲は育てる前提:可能ならテーブル化(Ctrl+T)で、追加行にも自動追従させる

この章の3データ(売上・名簿・案件)は、どの会社でも形を変えて必ず出てきます。まずは自分のファイルで「検索で探している作業」を1つ置き換えるところから始めると、効果が最速で体感できます。

コメント

NewsTowerをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む