XLOOKUPが苦手なコト、INDEX & MATCHなら余裕!

XLOOKUPが苦手なコト、INDEX & MATCHなら余裕! Excel

XLOOKUP関数のおさらいと「あれ?」な場面

Excelでデータを扱う皆さん、こんにちは!

XLOOKUP関数、使っていますか?

VLOOKUP関数の後継とも言われ、
確かに「かゆいところに手が届く!」便利な機能がたくさん詰まっていますよね。

エラー処理が簡単になったり、左方向の検索ができたりします。
一度使うとその便利さに手放せなくなる方も多いのではないでしょうか。

でも、そんな万能に見えるXLOOKUP関数にも、実はちょっと苦手なことがあるんです。

「あれ、こういう時どうするんだろう…?」と手が止まってしまう場面、ありませんか?

そんな時、長年Excelユーザーに愛されてきたINDEX関数とMATCH関数のコンビが、まだまだ頼りになる存在だってこと、知っていましたか?

今回の暇つぶしでは、「XLOOKUP関数が少し苦手とすること」を解説します。

そしてそんな時に「INDEX & MATCHコンビがどうやって解決してくれるのか」を、
具体的な例を交えながら探求していきます。

便利な新しい関数を覚えるのはもちろん大切です。

しかし、旧来からある関数の仕組みや強みを理解することで、Excelの応用力は格段にアップします。

何より「自分で考えて問題を解決する楽しさ」が味わえるはずです!

さあ、新旧関数の良いところを知って、あなたのExcelスキルをもう一段階レベルアップさせちゃいましょう!

INDEX & MATCHコンビネーション、まだまだ現役!具体的な活用術

XLOOKUP関数は、指定した範囲から特定の値を検索し、対応する値を返す関数です。

例えば、=XLOOKUP(検索する値, 検索範囲, 戻り範囲) というシンプルな書き方ができます。

XLOOKUP関数の説明図

これで、VLOOKUP関数でよくあった列番号の指定ミスや、検索方向の制限といった悩みから解放してくれました。

XLOOKUP関数の説明図

とっても便利なXLOOKUP関数ですが、以下のようなケースでは「うーん、ちょっと工夫が必要かも…」と感じることがあります。

あるいは「もっとスッキリ書けないかな?」と感じることもあります。

  • 表の中から、行と列が交差する場所の値をピンポイントで取り出したい!
  • 複数の条件を組み合わせて、合致するデータを探し出したい!
  • 検索結果として返してほしい列の位置が、状況によって変わるようにしたい!

こんな「あれ?」な場面で、INDEX関数とMATCH関数のコンビが真価を発揮するんです!

INDEXMATCH?名前は聞いたことあるけど、難しそう…」と感じる方もいるかもしれません。

でも大丈夫!
一つ一つの関数の役割を理解すれば、決して複雑ではありません。

MATCH関数: 指定した範囲の中で、検索値が「何番目にあるか」その相対的な位置を教えてくれます。

=MATCH(検索値, 検索範囲, 検索の種類)

=MATCH(検索値, 検索範囲, 検索の種類)

INDEX関数: 指定した範囲の中から、「何目の何目にあるか」を指定します。

そして、その場所の値を取り出してくれます。

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

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

この2つを組み合わせることで、XLOOKUP関数だけでは少し手間がかかる処理も、
スマートに実現できるんですよ。

早速、具体的なケースを見ていきましょう!

ケース1:行列の交差点をピンポイントで参照したい!

例えば、下のような月ごとの商品売上データがあるとします。

サンプルデータ

商品B」の「2月」の売上を知りたい!といった場合です。

XLOOKUP関数でやろうとすると…?

XLOOKUP関数でこれを行おうとすると、少し工夫が必要です。

例えば、まず商品名で該当の行全体をXLOOKUPで取得します。

その結果をさらに別のXLOOKUP関数で月の列を検索する、といったネスト(入れ子)構造が考えられます。

=XLOOKUP("2月", B1:D1, XLOOKUP("商品B", A2:A4, B2:D4))

数式
=XLOOKUP("2月", B1:D1, XLOOKUP("商品B", A2:A4, B2:D4))

直感的ではないかもしれませんね。

XLOOKUPの戻り範囲にさらにXLOOKUPを使うという発想は可能です。

しかし、もう少しスッキリさせたいところです。

INDEX & MATCHコンビならこう解決!

ここでINDEX関数とMATCH関数の出番です!

商品B」が商品リストの何行目にあるか?

MATCH("商品B", 商品名の列範囲, 0)

MATCH("商品B", 商品名の列範囲, 0)

2月」が月リストの何列目にあるか?

MATCH("2月", 月の行範囲, 0)

MATCH("2月", 月の行範囲, 0)

この2つの「位置情報」をINDEX関数に渡してあげれば、
ピンポイントで値を取り出せます。

仮に、売上データ全体(ヘッダー行と商品名の列を除く数値部分)がセル範囲 B2:D4 にあるとします。

商品名A2:A4 に、月の見出しB1:D1 にあるとすると、数式は以下のようになります。

=INDEX(B2:D4, MATCH("商品B", A2:A4, 0), MATCH("2月", B1:D1, 0))

=INDEX(B2:D4, MATCH("商品B", A2:A4, 0), MATCH("2月", B1:D1, 0))

数式の解説

MATCH("商品B", A2:A4, 0): A2:A4 の範囲(商品A, 商品B, 商品C)の中から「商品B」を探します。

それが2番目にあるので「2」を返します。

MATCH("2月", B1:D1, 0): B1:D1 の範囲(1月, 2月, 3月)の中から「2月」を探します。

それが2番目にあるので「2」を返します。

INDEX(B2:D4, 2, 2): B2:D4 のデータ範囲の「2行目」かつ「2列目」の値、つまり「110」を返します。

どうでしょう?

XLOOKUP関数をネストするよりも、
それぞれのMATCH関数が「番号」「番号」を求めているのが分かりやすいです。

スッキリしませんか?

ケース2:複数の条件で絞り込んでデータを取得したい!

次に、複数の条件にすべて合致するデータを探したいケースです。

例えば、以下のような従業員リストから、「東京」の「営業」に所属する「田中一郎」さんの売上を検索したい場合です。

サンプルデータ

XLOOKUP関数でやろうとすると…?

XLOOKUP関数は、基本的に単一の検索条件と検索範囲で動作します。

複数の条件を直接指定する機能は、標準では備わっていません。

工夫としては、作業列を作って条件を結合した文字列を作り、それを検索値にする方法があります。

文字列連結の説明図

例えば、=XLOOKUP(条件1&条件2&条件3, 条件範囲1&条件範囲2&条件範囲3, 取得範囲) のようにします。

=XLOOKUP(条件1&条件2&条件3, 条件範囲1&条件範囲2&条件範囲3, 取得範囲)

検索範囲と検索値を連結させることで擬似的に複数条件検索を行うことも可能です。

しかし、これは配列数式として扱われる場合があり、
また、データ量が多いとパフォーマンスに影響が出る可能性も考慮が必要です。

XLOOKUP関数単体でスマートに、とは言い難いかもしれません。

INDEX & MATCHコンビならこう解決!(配列数式)

INDEX関数とMATCH関数を組み合わせ、さらに「配列数式」というテクニックを使います。

そうすると、複数の条件に合致するデータを取り出すことができます。

東京」の「営業部」の「田中一郎」さんの売上を取得する数式は以下のようになります。

=INDEX(D2:D10, MATCH(1, (A2:A10="東京")*(B2:B10="営業部")*(C2:C10="田中一郎"), 0))

=INDEX(D2:D10, MATCH(1, (A2:A10="東京")*(B2:B10="営業部")*(C2:C10="田中一郎"), 0))

重要!

この数式は、入力後に Ctrl + Shift + Enter キーを同時に押して確定する必要があります。

そうすることで、数式が { } で囲まれ、配列数式として認識されます。

配列数式の様子

最近のバージョンのExcelでは、Enterだけで配列数式として機能する場合もあります。

数式の解説

(A2:A10="東京"): 地域列が「東京」であれば TRUE (1)、そうでなければ FALSE (0) の配列を返します。

(B2:B10="営業部"): 部署列が「営業部」であれば TRUE (1)、そうでなければ FALSE (0) の配列を返します。

(C2:C10="田中一郎"): 氏名列が「田中一郎」であれば TRUE (1)、そうでなければ FALSE (0) の配列を返します。

(A2:A10="東京")*(B2:B10="営業部")*(C2:C10="田中一郎"): これらの配列同士を掛け合わせます。

(A2:A10="東京")*(B2:B10="営業部")*(C2:C10="田中一郎")
の挙動

AND条件と同じで、すべてTRUE(1)の場合のみ結果が1になります。

一つでもFALSE(0)があれば結果は0になる配列が作られます。

例えば、条件にすべて一致する行は 1*1*1 = 1 となり、一致しない行は 0 となります。

MATCH(1, (上記の配列), 0): 作成された 01 からなる配列の中から、最初に 1 が現れる位置(行番号)を探します。

01配列の図

INDEX(D2:D10, (MATCH関数の結果)) : 売上列 D2:D10 から、
見つかった行番号に対応する売上を取り出します。

MATCH関数の結果

この方法は少し難易度が上がります。

しかし、複数の条件を柔軟に組み合わせられる強力なテクニックです。

XLOOKUPでこれを行うよりも、INDEX & MATCH配列数式の方が、
条件式を直感的に記述しやすいと感じる方もいるでしょう。

補足:Excel 2021 以降であれば、FILTER関数を使ってよりシンプルに書ける場合もあります。

=FILTER(D2:D10, (A2:A10="東京")*(B2:B10="営業部")*(C2:C10="田中一郎")) のように書けます。

数式
=FILTER(D2:D10, (A2:A10="東京")*(B2:B10="営業部")*(C2:C10="田中一郎"))

ただ、INDEX&MATCHの「検索」能力を示す例としてご紹介しました。

ケース3:検索結果を返す列を「動的に」変えたい!

最後に、検索して取得したい情報の「項目名」(つまり列)が固定ではない場合を考えましょう。

状況によって変わる場合です。

例えば、以下の商品データで、「商品B」の「単価」を知りたい時もあれば、「在庫数」を知りたい時もある、というようなケースです。

XLOOKUP関数でやろうとすると…?

XLOOKUP関数では、戻り範囲直接指定する必要があります。

もし「単価」と「在庫数」で戻り範囲を切り替えたい場合、IF関数やSWITCH関数を使います。

これらを戻り範囲の引数の中で使うことになるでしょう。

=XLOOKUP("商品B", 商品名列, IF(取得したい項目セル="単価", 単価列, IF(取得したい項目セル="在庫数", 在庫数列)))

項目の種類が少ないうちはこれでも対応できます。

しかし、項目が増えてくるとIF関数のネストが深くなり、数式が複雑になってしまいます。

INDEX & MATCHコンビならこう解決!

ここでもINDEX & MATCHコンビが活躍します。

ケース1の応用で、行だけでなく「列もMATCH関数で動的に指定する」という考え方です。

サンプルデータ

そして、検索したい商品名をセル D1 に入力します。

取得したい項目名(例:「在庫数」)をセル E1 に入力するとします。

=INDEX(A1:C4, MATCH(D1, A1:A4, 0), MATCH(E1, A1:C1, 0))

数式
=INDEX(A1:C4, MATCH(D1, A1:A4, 0), MATCH(E1, A1:C1, 0))

数式の解説

MATCH(D1, A1:A4, 0): セル D1 に入力された商品名(例:「商品B」)が、A1:A4 の範囲の何行目にあるかを返します。

MATCH(D1, A1:A4, 0)の説明

(ヘッダー行を含む範囲で検索しているので、商品Bなら3行目です。)

MATCH(E1, A1:C1, 0): セル E1 に入力された項目名(例:「在庫数」)が、A1:C1 の範囲の何列目にあるかを返します。

MATCH(E1, A1:C1, 0)の説明

(「在庫数」なら3列目です。)

INDEX(A1:C4, (行のMATCH結果), (列のMATCH結果)): データ範囲全体 A1:C4 の中から指定します。

指定された行と列が交差する場所の値を取り出します。

行と列が交差する場所

例えば、D1に「商品B」、E1に「在庫数」と入力すれば、INDEX(A1:C4, 3, 3) となります。

商品Bの在庫数である「80」が返ってきます。

E1 を「単価」に変えれば、INDEX(A1:C4, 3, 2) となり、単価の「120」が返ってきます。

取得したい項目名を変えるだけで、
数式自体を修正する必要がないのが大きなメリットです!

XLOOKUPの良さも再確認!結局は使い分けが肝心!

ここまでINDEX & MATCHコンビの活躍シーンを見てきました。

だからといって「XLOOKUPはもう不要!」ということでは決してありません。

XLOOKUP関数には、多くのメリットがあります。

  • デフォルトで完全一致検索なので、検索の種類 を指定し忘れるミスがない。
  • 検索方向を気にせず、左側の列の値も簡単に取得できる。
  • 複数の列を一度に返すことができる。(戻り範囲に複数列を指定するだけ)
  • 見つからなかった場合の処理が組み込まれている。

これらはINDEX & MATCHコンビにはないシンプルさや強力なメリットです。

日常的な多くの検索シーンでは、XLOOKUP関数の方がはるかに手軽で効率的でしょう。

大切なのは、「どちらが優れているか」ではありません。

「それぞれの関数の得意なこと苦手なことを理解し、場面に応じて最適な関数を選択する」ということです。

まさに「適材適所」ですね!

まとめ:Excelの本質を理解して、もっと自由に、もっと楽しく!

今回は、XLOOKUP関数が少し苦手とする場面を見てきました。

そして、そんな時にINDEX関数とMATCH関数のコンビがいかに頼りになるかを見てきました。

新しい便利な関数が登場すると、ついついそれに頼りがちになります。

しかし、古くから使われている関数にも、その仕組みを理解することで見えてくる良さや応用力があります。

「なぜこの関数でこの結果が出るんだろう?」
「もっと効率的な方法はないかな?」

そういった疑問を持ち、関数の仕組みやデータの構造に目を向けることが、
Excelのスキルアップには欠かせません。

そして、その疑問を解決できた時の達成感は、
Excelをもっと好きになる一番の近道です!

Excelは、ただの表計算ソフトではありません。

あなたのアイデア次第で、強力なデータ分析ツールにもなります。
業務を効率化する自動化ツールにもなります。

そして時には今回のような「頭の体操」を楽しむ遊び道具にもなってくれます。
これからも、色々な関数の組み合わせを試したり、新しい使い方を発見したりしましょう。

また次回のExcel探求の旅でお会いしましょう!

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