【脱VLOOKUP依存!】ExcelのINDEX関数とMATCH関数でデータ抽出を自由自在に操る方法

Excel

すもリーマン
すもリーマン

VLOOKUP関数、便利だけどなんか使いづらいな

すもリーマン
すもリーマン

表の形によっては使えない時がある!

でんちゃん
でんちゃん

すもりーマンのように感じたことはありませんか?
もしかしたら、Excelの理解がどんどん進んできてあんなことやこんなことがしたいと思えているのではないでしょうか?

Excelでデータを検索したり抽出したりする際に、多くの人がまず思い浮かべるのがVLOOKUP関数ですよね。

でも、実はVLOOKUP関数にはいくつかの弱点があるんです。

そして、その弱点を克服し、もっと自由に、もっと効率的にデータを取り出せるようになるのが、INDEX関数とMATCH関数の組み合わせです!

この記事では、

について、解説していきます!


VLOOKUP関数で困っていませんか?その悩み、INDEX+MATCHで解決できるかも!

でんちゃん
でんちゃん

普段Excelで作業している中で、VLOOKUP関数を使っていて次のような悩みに直面したことはありませんか?

もしひとつでも当てはまったら、あなたはVLOOKUP関数の「壁」にぶつかっている状態かもしれません。

実はVLOOKUP関数には、いくつか得意ではないことがあるんです。

VLOOKUP関数の主な弱点

  1. 検索値が常に左端の列にある必要がある
    • VLOOKUP関数は、指定した範囲の一番左の列から検索値を探し、そこから右方向にあるデータしか取り出せません。これが最大の制約です。「この右側のデータから、左側の顧客名を探したい!」といった逆方向の検索は、VLOOKUP関数単体ではできないんです。
  2. 列の挿入・削除に弱い
    • VLOOKUP関数は、何列目のデータを取ってくるかを「列番号」という数字で指定します。例えば、「3列目のデータを取ってきて」と指定しますよね。もし参照範囲の途中に新しい列を追加したり、既存の列を削除したりすると、この「列番号」がズレてしまい、数式がエラーになったり、間違ったデータを参照してしまったりする可能性があるんです。
  3. データ量が多いと処理が遅くなる場合がある
    • 膨大なデータの中から特定の情報を探す際、VLOOKUP関数だと計算に時間がかかってしまうことがあります。これは、VLOOKUP関数が指定された範囲全体を「ざっくり」と見に行くためです。

もちろん、VLOOKUP関数が便利で使いやすいことに変わりはありません。

しかし、これらの弱点があるために、もっと柔軟なデータ検索が必要な場面で立ち往生してしまうことがあるんです。
データが大量の場合、VLOOKUP関数以外の使用を検討する必要があります。

でんちゃん
でんちゃん

VLOOKUP関数についてもっと詳しく知りたい!」という方は、こちらの記事も参考にしてみてください!


なぜExcel上級者はINDEX関数とMATCH関数を組み合わせるの?

VLOOKUP関数の弱点を補い、さらに強力なデータ検索を可能にするのが、INDEX関数MATCH関数の組み合わせです。

Excel上級者の多くがこの組み合わせを使うのは、その圧倒的な柔軟性処理速度の速さに理由があります。

すもリーマン
すもリーマン

え、関数を2つも使うなんて難しそう…

でんちゃん
でんちゃん

すもリーマンのように感じるかもしれませんが、大丈夫!
それぞれの関数の役割を理解すれば、意外とシンプルなんです。

INDEX関数の役割:指定した場所の「値」を取り出す

INDEX関数は、

指定した範囲の中から、〇行目と〇列目にある値は何ですか?」と尋ねると、その答えを返してくれる関数です。

イメージとしては、宝の地図で「A地点の東へ3歩、北へ2歩の場所にある宝は何?」と聞くようなものです。

構文: =INDEX(参照範囲, 行番号, [列番号])

  • 参照範囲:値を取り出したいセルの範囲を指定します。
  • 行番号:参照範囲内で、上から何番目の行にあるデータを取り出したいかを指定します。
  • 列番号:参照範囲内で、左から何番目の列にあるデータを取り出したいかを指定します。(省略可能です。1列の範囲から取り出す場合は不要です。)

例: =INDEX(A1:C10, 3, 2) → A1からC10の範囲で、3行目2列目(つまりB3セル)の値を取り出します。

MATCH関数の役割:指定した「値」がどこにあるか見つける

MATCH関数は、

この値は、指定した範囲の中で何番目にありますか?」と尋ねると、その「位置(何番目か)」を返してくれる関数です。

イメージとしては、本棚で「〇〇というタイトルの本は、左から何番目にありますか?」と聞くようなものです。

構文: =MATCH(検索値, 検索範囲, [照合の種類])

  • 検索値:検索したい値を指定します。
  • 検索範囲:検索値を探す範囲を指定します。(必ず1行または1列の範囲を指定します
  • 照合の種類:検索方法を指定します。
    • 0完全一致(最もよく使われます。検索値と完全に一致するものを探します)
    • 1:検索値以下で最大の値(昇順で並べ替えられている場合に使う)
    • -1:検索値以上で最小の値(降順で並べ替えられている場合に使う)

例: =MATCH(“りんご”, A1:A10, 0) → A1からA10の範囲で「りんご」が上から何番目にあるかを返します。例えば、A5に「りんご」があれば「5」を返します。

INDEXとMATCHの組み合わせが最強な理由

これらの関数を組み合わせると、「〇〇という値が、この範囲の△番目の行にあるから、その行の□番目の列にある値を取り出して!」というように、動的に行番号や列番号を指定できるようになるんです。

=INDEX(取得したい範囲, MATCH(検索値, 検索値がある列の範囲, 0))

この組み合わせによって、VLOOKUP関数の弱点を見事にカバーできるわけです。

  • 検索値が左右どちらにあってもOK!
    MATCH関数で検索値の位置を特定し、INDEX関数でその位置にある任意の列のデータを取り出せるため、検索値が目的のデータの左側になくても大丈夫です。
  • 列の挿入・削除に強い!
    MATCH関数が列の「位置」を返すため、途中で列が追加・削除されても、自動的に位置を調整してくれます。数式が壊れる心配が格段に減ります。
  • 処理速度が速い!
    MATCH関数でピンポイントの位置を特定し、INDEX関数でその位置の値を直接取り出すため、VLOOKUPのように範囲全体をざっくりと検索する必要がなく、特にデータ量が多い場合に高速に処理できます。
  • 複数条件での検索も可能!
    少し応用が必要ですが、MATCH関数を工夫することで、複数の条件を満たすデータを検索することもできるようになります。

具体例で見てみよう!INDEX+MATCH関数の使い方

でんちゃん
でんちゃん

それでは、具体的なデータを使って、INDEX関数MATCH関数の組み合わせがどれほど便利か見ていきましょう。

以下の商品リストのデータがあるとします。

【商品リスト】

商品ID商品名カテゴリ価格
A001ノートパソコン家電80000
A002スマートフォン家電60000
A003デジタルカメラ家電50000
B001Tシャツ衣料品3000
B002ジーンズ衣料品8000
C001コーヒー豆食品1500
C002紅茶食品1200
商品リスト

例1:商品IDから「価格」を検索する

でんちゃん
でんちゃん

ここでは、「商品ID」から「価格」を検索してみましょう。
VLOOKUP関数でもできますが、今回はINDEX+MATCHを使います。

目的:商品ID「A002」の価格を知りたい

  1. INDEX関数の取得したい範囲:価格が入力されている列(例:D列)を指定します。
  2. MATCH関数の検索値:「A002」
  3. MATCH関数の検索範囲:商品IDが入力されている列(例:A列)を指定します。

数式: =INDEX(D:D, MATCH(“A002”, A:A, 0))

この数式は、次のように解釈されます。

  • MATCH("A002", A:A, 0):A列の中から「A002」が何行目にあるかを探します。この場合、「3」が返されます(「A002」はA列の3行目にあるため)。
  • INDEX(D:D, 3):D列の3行目にある値(「60000」)を取り出します。

結果として、「60000」が返されます。

出力結果

例2:商品名から「商品ID」を検索する(VLOOKUPでは難しいパターン!)

でんちゃん
でんちゃん

今度は、「商品名」から「商品ID」を検索してみましょう。これはVLOOKUP関数では難しいパターンですね。
なぜなら、商品ID(A列)が商品名(B列)の左側にあるからです。

目的:商品名「ジーンズ」の商品IDを知りたい

  1. INDEX関数の取得したい範囲:商品IDが入力されている列(例:A列)を指定します。
  2. MATCH関数の検索値:F2
  3. MATCH関数の検索範囲:商品名が入力されている列(例:B列)を指定します。

数式: =INDEX(A:A, MATCH(F2, B:B, 0))

この数式は、次のように解釈されます。

  • MATCH(F2, B:B, 0):B列の中からF2セル(“ジーンズ”)が何行目にあるかを探します。この場合、「6」が返されます(「ジーンズ」はB列の6行目にあるため)。
  • INDEX(A:A, 6):A列の6行目にある値(「B002」)を取り出します。

結果として、「B002」が返されます。

出力結果

例3:行と列の両方を動的に指定してデータを抽出する

でんちゃん
でんちゃん

INDEX関数は列番号も指定できるので、MATCH関数をもう一つ使って、行と列の両方を動的に検索することもできます。
これは、特に複雑なデータ抽出クロス集計のような場面で非常に役立ちます。

目的:商品ID「C001」の「カテゴリ」を知りたい

  1. INDEX関数の取得したい範囲:データ全体(例:A:D列、または表全体)を指定します。
  2. 1つ目のMATCH関数(行番号用)の検索値:「C001」
  3. 1つ目のMATCH関数(行番号用)の検索範囲:商品IDが入力されている列(例:A列)を指定します。
  4. 2つ目のMATCH関数(列番号用)の検索値:「カテゴリ」
  5. 2つ目のMATCH関数(列番号用)の検索範囲:見出し行(例:A1:D1)を指定します。

数式: =INDEX(A:D, MATCH(“C001”, A:A, 0), MATCH(“カテゴリ”, A1:D1, 0))

この数式は、次のように解釈されます。

  • MATCH("C001", A:A, 0):A列の中から「C001」が何行目にあるかを探します。この場合、「7」が返されます。
  • MATCH("カテゴリ", A1:D1, 0):A1からD1の範囲(見出し行)の中から「カテゴリ」が何列目にあるかを探します。この場合、「3」が返されます。
  • INDEX(A:D, 7, 3):A列からD列の範囲で、7行目3列目にある値(つまりC7セル)を取り出します。

結果として、「食品」が返されます。

出力結果


INDEX+MATCH関数を使いこなすためのヒント

  • 絶対参照を使いこなす
    数式をコピー&ペーストする際に、参照範囲がずれないように、$マークを使った絶対参照(例:$A:$A$A$1:$D$1)を適切に使うことが重要です。
  • エラー処理
    検索値が見つからなかった場合に#N/Aエラーが出る場合があります。IFERROR関数と組み合わせることで、エラー表示を「見つかりません」などの分かりやすいメッセージに変えることができます。
    • =IFERROR(INDEX(D:D, MATCH("A002", A:A, 0)), "データが見つかりません")
  • 名前の定義を活用する
    頻繁に使う範囲には「名前の定義」をしておくと、数式がより分かりやすくなり、入力ミスも減らせます。例えば、A列に「商品ID_列」、D列に「価格_列」と名前を付けておくと、=INDEX(価格_列, MATCH("A002", 商品ID_列, 0))のように記述できます。

まとめ:INDEX+MATCHでExcelの可能性を広げよう!

でんちゃん
でんちゃん

VLOOKUP関数は手軽で便利な関数ですが、INDEX関数とMATCH関数の組み合わせは、そのVLOOKUP関数の弱点を補い、より柔軟で便利なデータ検索を可能にします。

特徴VLOOKUP関数INDEX + MATCH関数
検索列の位置必ず左端である必要あり左右どちらでも可能
列の変更への耐性弱い(エラーになりやすい)強い(変更に影響されにくい)
処理速度大量データでは遅くなる可能性あり大量データでも高速に処理可能
複雑な条件検索不向き可能
記述のしやすさシンプルで分かりやすい最初は複雑に感じる

最初は少し難しく感じるかもしれませんが、一度使い方を覚えてしまえば、Excelでの作業効率がグンと上がり、データ活用の幅が大きく広がります。VLOOKUP関数で困っていたあの悩みも、きっと解決できるはずですよ!

でんちゃん
でんちゃん

ぜひ、この記事を参考にINDEX関数とMATCH関数を組み合わせて、Excelを自由自在に操る楽しさを体験してみてくださいね!

コメント

タイトルとURLをコピーしました