XLOOKUP ネスト(多条件検索):配列計算で複数列の条件をスパッと射抜く
💡 やりたいこと
「店舗」と「商品名」など、複数の条件(列)の組み合わせが完全に一致する行を探し出し、別の列(売上など)を取り出したい。 たとえば「東京店」の「パソコン」の売上だけをピンポイントで抽出する、といった場面です。
📌 この記事を読む前に知っておくべきこと
INDEX+MATCH でも VLOOKUP+CHOOSE
でも、同じ書き方(&結合やブール乗算)による多条件検索は昔から可能でした。ただし大きな違いがあります。Excel 2019 以前では、これらの配列を使う数式は
Ctrl+Shift+Enter(CSE)で確定しないと動きません。Excel 2021/2024/Microsoft 365 などでは
CSE が不要になり、どの関数でも普通の Enter だけで配列処理されます。つまりXLOOKUP の真の優位性は「&結合ができること」ではなく、「#N/A回避が引数内で完結する」「複数列を一括でスピル返却できる」「可読性が高い」という別の点にあります。
この記事では、この事実を正確に踏まえた上で、各方式を網羅的に解説します。
サンプルデータ(この記事で使う共通のマスタ表)
以下の売上データ(D〜G列)を使って、すべてのテクニックを説明します。
| D | E | F | G | |
| 1 | 店舗 | 商品名 | 売上 | 数量 |
| 2 | 東京店 | パソコン | 500,000 | 5 |
| 3 | 東京店 | スマホ | 300,000 | 15 |
| 4 | 大阪店 | パソコン | 450,000 | 4 |
| 5 | 大阪店 | スマホ | 280,000 | 12 |
| 6 | 福岡店 | パソコン | 380,000 | 3 |
| 7 | 福岡店 | スマホ | 220,000 | 10 |
検索側(A〜C列)はこのようなレイアウトです。
| A | B | C | |
| 1 | 店舗 | 商品名 | 売上(結果) |
| 2 | 大阪店 | パソコン | (ここに数式を入れる) |
🗺️ 全方式の俯瞰マップ
この記事で紹介する多条件検索の方式を先に一覧で示します。詳細は後述します。
| 方式 | 数式の概要 | CSE必要? | 対応Ver | 作業列 |
|---|---|---|---|---|
| ① | XLOOKUP &結合 | 不要 | 2021/2024/365 | 不要 |
| ② | XLOOKUP ブール論理(乗算) | 不要 | 2021/2024/365 | 不要 |
| ③ | INDEX+MATCH &結合 | ⚠ 2019以前は必要 | 全ver | 不要 |
| ④ | INDEX+MATCH ブール論理 | ⚠ 2019以前は必要 | 全ver | 不要 |
| ⑤ | INDEX+MATCH 二重INDEX技(CSE回避) | 不要 | 全ver | 不要 |
| ⑥ | VLOOKUP+CHOOSE ブール論理 | ⚠ 2019以前は必要 | 全ver | 不要 |
| ⑦ | VLOOKUP+作業列(結合キー) | 不要 | 全ver | 必要 |
| ⑧ | AGGREGATE 方式 | 不要 | 2010~ | 不要 |
方式①:XLOOKUP &結合(推奨) 2021~
A2(大阪店)とB2(パソコン)を結合した「大阪店パソコン」を、D列とE列を結合した仮想配列の中から探し、見つかったらF列(売上)を返す。見つからなければ「該当なし」。
| D | E | 仮想配列 | |||
| 2 | 東京店 | & | パソコン | → | 東京店パソコン |
| 3 | 東京店 | & | スマホ | → | 東京店スマホ |
| 4 | 大阪店 | & | パソコン | → | 大阪店パソコン ✓ |
| 5 | 大阪店 | & | スマホ | → | 大阪店スマホ |
| 6 | 福岡店 | & | パソコン | → | 福岡店パソコン |
| C |
| 450,000 |
・#N/A 回避が引数内で完結:第4引数
"該当なし" だけでOK。IFERROR で包む必要がない。・複数列の一括返却:
=XLOOKUP(A2 & B2, D:D & E:E, F:G, "該当なし") で売上と数量を同時にスピル展開。・後方検索:第6引数に
-1 を指定すると、最後にヒットした行を取得可能。
「A」&「BC」と「AB」&「C」はどちらも結合すると「ABC」になり、区別できません。
実務でこのリスクがある場合は、間に区切り文字を挟みます。
=XLOOKUP(A2 & "|" & B2, D:D & "|" & E:E, F:F, "該当なし")
方式②:XLOOKUP ブール論理(乗算) 2021~
D列がA2と一致(TRUE=1 / FALSE=0)かつ E列がB2と一致。両方1のとき 1×1=1。検索値を「1」にしてその行を探す。
| D | E | D=A2? | E=B2? | 乗算 | F | ||||
| 2 | 東京店 | パソコン | 0 | 1 | 0 | 500,000 | |||
| 3 | 東京店 | スマホ | 0 | 0 | 0 | 300,000 | |||
| 4 | 大阪店 | パソコン | 1 | 1 | 1 | 450,000 | |||
| 5 | 大阪店 | スマホ | 1 | 0 | 0 | 280,000 | |||
| 6 | 福岡店 | パソコン | 0 | 1 | 0 | 380,000 |
XLOOKUP(1, …) はこの 1 を探し、同じ行のF列(450,000)を返します。
・3条件以上:
* (G:G>=3) のように * で繋げるだけ。・OR条件(いずれか一致):
+ を使い、=XLOOKUP(1, (D:D=A2) * ((E:E="パソコン")+(E:E="スマホ")), F:F)・数値の範囲条件(>=, <= 等)を自然に記述可能。&結合では不可能。
| 比較項目 | &結合 | ブール論理 |
|---|---|---|
| 可読性 | ✅ 高い(直感的) | ⚠ やや難解 |
| 文字列の完全一致のみ(2条件) | ✅ 最適 | ○ 使用可能 |
| 数値範囲条件(>= 等) | ❌ 不可 | ✅ 自然に記述可能 |
| OR条件 | ❌ 不可 | ✅ + で記述可能 |
| 誤ヒットのリスク | ⚠ あり(区切り文字で回避) | ✅ なし |
| 処理速度 | ✅ やや速い | ⚠ やや遅い |
🔧 旧バージョンでの代替法(全方式の解説)
ここが重要なポイントです。&結合もブール論理も、INDEX+MATCHやVLOOKUPでも昔から使えます。 ただしExcelのバージョンによってCSEの要否が異なります。以下、方式ごとに正確に整理します。
Excel 2021 / 2024 / Microsoft 365 などの場合:普通の Enter で確定するだけで動作します。
Excel 2019 以前の場合:まったく同じ数式ですが、Ctrl+Shift+Enter が必須です。
※ 波括弧 {} は手入力ではなく、Ctrl+Shift+Enter で自動的に付きます。
D:D & E:E で仮想的な結合配列を作り、A2 & B2
を検索する仕組みはまったく同じ。違いはCSEの要否と、IFERRORが必要かどうかです。
Excel 2021 / 2024 / Microsoft 365 など:
Excel 2019 以前:
Ctrl+Shift+Enter で確定が必須。
2019以前の環境で Ctrl+Shift+Enter を忘れてしまう問題を根本的に回避するため、コミュニティで発見されたテクニックです。
2つ目の INDEX関数を挟むことで、CSE なしで配列を処理させます。
普通の Enter だけで確定OK。CSE 不要。全バージョンで動作。
(D:D=A2)*(E:E=B2)
→ {0,0,1,0,0,0}
INDEX(…, 0, 1)
配列を「受け取って返す」
→ CSEの代わりに配列を確定
→ 位置「3」を返す
→ 450,000
INDEX(配列, 0, 1)
は「行番号0(=全行)、列番号1」を意味し、INDEX関数が配列をネイティブに処理してそのまま配列として返すという特性を利用しています。
技術的には内部で配列計算が行われていますが、CSE操作が不要なため「弾丸耐性(bulletproof)」のある数式として知られています。
・数式が1段深くなるため、可読性はやや低下します。
・内部では配列計算が走っているため、処理速度はCSE配列数式と同等(改善されるわけではない)。
・Excel 2021/2024/Microsoft 365 環境なら不要なテクニックです。レガシー環境向けの知識として理解しておくのが最善。
VLOOKUPは本来、検索値を1つしか受け取れません。しかし CHOOSE
関数を使ってメモリ上に仮想的な2列テーブルを構築し、その1列目にブール論理の結果(0/1)、2列目に戻り値を配置することで、作業列なしの多条件検索が可能です。
Excel 2019 以前では Ctrl+Shift+Enter で確定が必要。Excel 2021/2024/Microsoft 365 などでは通常の Enter でOK。
| 乗算結果 |
| 0 |
| 0 |
| 1 |
| 0 |
| 0 |
| 0 |
| F |
| 500,000 |
| 300,000 |
| 450,000 |
| 280,000 |
| 380,000 |
| 220,000 |
| 列1 | 列2 |
| 0 | 500,000 |
| 0 | 300,000 |
| 1 | 450,000 |
| 0 | 280,000 |
| 0 | 380,000 |
| 0 | 220,000 |
CHOOSE({1,2}, 配列A, 配列B) は、{1,2}
という配列定数により「1番目と2番目を同時に要求」し、2つの配列を横に結合した仮想テーブルを作ります。VLOOKUPはこのテーブルの列1から「1」を探し、列2の値(450,000)を返します。
・CHOOSE の仕組みを理解していないと数式の意味が全くわからない(属人化リスクが極めて高い)
・Excel 2019 以前では CSE が必要
・列全体参照(D:D)ではなく範囲を限定して指定する必要がある(CHOOSEが列全体を仮想テーブル化するとメモリ負荷が極大になる)
・VLOOKUPの列番号指定(ここでは
2)が必要なため、保守性は VLOOKUP 固有の弱さを引き継ぐ
最も古典的で、最も理解しやすい手法。マスタ表の左端に結合キー列を追加し、VLOOKUPで検索します。
| C | D | E | F | |
| 1 | 結合キー(作業列) | 店舗 | 商品名 | 売上 |
| 2 | 東京店パソコン | 東京店 | パソコン | 500,000 |
| 3 | 東京店スマホ | 東京店 | スマホ | 300,000 |
| 4 | 大阪店パソコン | 大阪店 | パソコン | 450,000 |
CSE不要。全バージョンで動作。ただし作業列(C列)の追加・維持が必要。
・CSEが一切不要(配列計算をしないため)
・処理速度が速い(メモリ上に仮想配列を生成しない)
・数式がシンプルで、VLOOKUP を知っている人なら誰でも理解できる
・全バージョンで安定動作
・元データの構造を変更する必要がある(列の挿入)
・データ行が増えるたびに作業列の数式をコピーする必要がある
・ファイルサイズが増加する
・VLOOKUPの列番号指定により、列の挿入・削除でズレるリスクがある
Excel 2010 で追加された AGGREGATE 関数は、配列を引数に受け取れるため CSE なしで多条件検索が可能です。
CSE配列数式のフリーズ問題を回避する手段として、2010〜2019 の環境で重宝されてきました。
AGGREGATE(15, 6, …, 1) = SMALL関数相当(エラー無視モード)。
条件に一致しない行は 0 で除算されるため #DIV/0! になり、AGGREGATE のエラー無視機能(第2引数=6)で自動的にスキップされます。
| ROW() | 条件乗算 | ROW ÷ 乗算 | ||
| 2 | 2 | 0 | 2÷0 = #DIV/0!(除外) | |
| 3 | 3 | 0 | 3÷0 = #DIV/0!(除外) | |
| 4 | 4 | 1 | 4÷1 = 4(行番号として採用) | |
| 5 | 5 | 0 | 5÷0 = #DIV/0!(除外) |
INDEX(F:F, 4) = 450,000。
・CSE 完全不要で2010以降の全バージョンで動作
・
AGGREGATE(15,6,…,ROWS($A$1:$A1)) のように k 値を連番にすると、複数のヒット行を順番に取得できる(MATCH
にはできない)・ただし数式が長く難解になりやすいため、2021/2024/Microsoft 365 環境なら XLOOKUP や FILTER 関数を使うべき
⚠️ CSE配列数式(Ctrl+Shift+Enter)の限界と問題点
方式③④⑥で必要となるCSE配列数式は、数多くの深刻な制約と落とし穴を抱えています。 XLOOKUPをはじめとする新しい動的配列関数が登場した最大の理由が、これらの問題を根本的に解消するためでした。
Enter だけで確定すると、配列として処理されず全く別の結果や #VALUE! エラーが返ります。
数式バーを見ても波括弧 {} が付いていないことに気づかないまま運用されるケースが多く、サイレントなデータ事故の温床です。
Enter で確定すると、CSE状態が解除されて壊れます。
CSEを知らない後任者がファイルをメンテナンスすると確実に問題が発生します。
D:D のような列全体参照を使うと、約104万行分の配列がメモリに展開され、極端に遅くなるかフリーズします。
CSEでは D2:D10000 のように範囲を限定するのが実務ルールでした。
Ctrl+Shift+Enter が必要なのか、なぜ普通の Enter だと壊れるのか。
独学では到達しにくい知識のため、作成者の異動・退職後にメンテナンス不能になる典型パターンです。
内部で結合配列を生成→検索
動的配列エンジンが最適化
①10,000個のTRUE/FALSE配列を生成×条件数
②10,000回の乗算
③MATCHで10,000個を走査
④メモリに一時配列を確保→破棄
| データ規模 | CSE配列数式 | XLOOKUP &結合 |
作業列 +VLOOKUP |
AGGREGATE |
|---|---|---|---|---|
| マスタ100行 × 数式10行 | 一瞬 | 一瞬 | 一瞬 | 一瞬 |
| マスタ10,000行 × 数式1,000行 | 数秒〜十数秒 | ✅ 一瞬〜1秒 | ✅ 一瞬〜1秒 | ○ 数秒 |
| マスタ100,000行 × 数式10,000行 | 🔴 数十秒〜数分 | ✅ 数秒 | ✅ 数秒 | ⚠ 十数秒 |
| マスタ500,000行以上 | 🔴 実用困難 | ✅ 十数秒 | ○ 数秒〜十数秒 | ⚠ 厳しい |
→ 詳細なベンチマーク比較は 速度カテゴリ を参照。
Ctrl+Shift+Enter が完全に不要・編集後も配列計算が壊れない
・処理速度が劇的に改善
・列全体参照(D:D)が安全に使える
・可読性が大幅に向上
・スピル展開で数式1本から複数セルに結果が出せる
・既存ファイルの保守(レガシーファイルの理解)
・新関数は2019以前では
#NAME? エラーになる・移行期間中は互換性の確認が必要
全方式の最終比較まとめ
| 項目 | ①XLOOKUP &結合 |
②XLOOKUP ブール |
③④INDEX +MATCH |
⑤二重 INDEX技 |
⑥VLOOKUP +CHOOSE |
⑦作業列 +VLOOKUP |
⑧AGGREGATE |
|---|---|---|---|---|---|---|---|
| 対応Ver | 2021/2024/365 | 2021/2024/365 | 全ver | 全ver | 全ver | 全ver | 2010~ |
| CSE必要 | ✅ 不要 | ✅ 不要 | ⚠ 2019以前は必要 | ✅ 不要 | ⚠ 2019以前は必要 | ✅ 不要 | ✅ 不要 |
| 作業列 | ✅ 不要 | ✅ 不要 | ✅ 不要 | ✅ 不要 | ✅ 不要 | ❌ 必要 | ✅ 不要 |
| #N/A回避 | ✅ 引数内 | ✅ 引数内 | ⚠ IFERROR | ⚠ IFERROR | ⚠ IFERROR | ⚠ IFERROR | ⚠ IFERROR |
| 数値範囲条件 | ❌ 不可 | ✅ 可能 | ✅ 可能 | ✅ 可能 | ✅ 可能 | ❌ 不可 | ✅ 可能 |
| 速度 | ✅ 高速 | ○ やや速い | ❌ CSE時は遅い | ❌ 内部は同等に遅い | ❌ CSE時は遅い | ✅ 高速 | ○ 中程度 |
| 可読性 | ✅ 高い | ○ やや難解 | ○ 普通 | ❌ 難解 | ❌ 非常に難解 | ✅ 高い | ❌ 難解 |
| 複数列返却 | ✅ スピル | ✅ スピル | ❌ 列ごと | ❌ 列ごと | ❌ 列ごと | ❌ 列ごと | ❌ 列ごと |
📝 小技・注意点
-
【大文字・小文字の区別】
XLOOKUP や MATCH の標準検索は大文字・小文字を区別しません。 区別したい場合は EXACT 関数をブール論理に組み込みます。
=XLOOKUP(1, EXACT(D:D, A2) * EXACT(E:E, B2), F:F, "該当なし") -
【重複データがある場合】
XLOOKUP は最初にヒットした行を返します。最後のヒットを取得するには第6引数-1(末尾から検索)を指定。 条件に合致する複数行をすべて取得したい場合は FILTER関数 の領域です。 -
【3条件以上の実例】
&結合:=XLOOKUP(A2 & "|" & B2 & "|" & C2, D:D & "|" & E:E & "|" & F:F, G:G, "該当なし")
ブール:=XLOOKUP(1, (D:D=A2) * (E:E=B2) * (F:F=C2), G:G, "該当なし")
条件が増えるほどブール論理のほうが簡潔です。 -
【SUMIFSとの使い分け】
多条件で「合計」を求めたい場合(同じ店舗・商品の売上合計など)は XLOOKUP ではなくSUMIFSの領域です。 XLOOKUP はあくまで「1行を特定して値を取り出す」関数です。 -
【&結合でバイナリ検索は使えない】
D:D & E:Eの仮想配列はソート状態が保証されないため、 第6引数=2(バイナリ検索)を指定しても正しく動作しない可能性があります。