XLOOKUP ネスト(多条件検索):配列計算で複数列の条件をスパッと射抜く

💡 やりたいこと

「店舗」と「商品名」など、複数の条件(列)の組み合わせが完全に一致する行を探し出し、別の列(売上など)を取り出したい。 たとえば「東京店」の「パソコン」の売上だけをピンポイントで抽出する、といった場面です。

📌 この記事を読む前に知っておくべきこと

「&結合」や「ブール論理による多条件検索」は、XLOOKUP の専売特許ではありません。
INDEX+MATCH でも VLOOKUP+CHOOSE でも、同じ書き方(&結合やブール乗算)による多条件検索は昔から可能でした。

ただし大きな違いがあります。Excel 2019 以前では、これらの配列を使う数式は Ctrl+Shift+Enter(CSE)で確定しないと動きません。Excel 2021/2024/Microsoft 365 などでは CSE が不要になり、どの関数でも普通の Enter だけで配列処理されます。

つまりXLOOKUP の真の優位性は「&結合ができること」ではなく、「#N/A回避が引数内で完結する」「複数列を一括でスピル返却できる」「可読性が高い」という別の点にあります。
この記事では、この事実を正確に踏まえた上で、各方式を網羅的に解説します。

サンプルデータ(この記事で使う共通のマスタ表)

以下の売上データ(D〜G列)を使って、すべてのテクニックを説明します。

マスタ表(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
🟠 橙の行(行4)が今回の検索ターゲット:「大阪店」かつ「パソコン」の売上 450,000 を取得するのがゴールです。

検索側(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~

数式
=XLOOKUP(A2 & B2, D:D & E:E, F:F, "該当なし")

A2(大阪店)とB2(パソコン)を結合した「大阪店パソコン」を、D列とE列を結合した仮想配列の中から探し、見つかったらF列(売上)を返す。見つからなければ「該当なし」。

内部動作:仮想配列の生成と検索
D列 & E列 → 仮想配列
データテーブル
D E 仮想配列
2 東京店 & パソコン 東京店パソコン
3 東京店 & スマホ 東京店スマホ
4 大阪店 & パソコン 大阪店パソコン ✓
5 大阪店 & スマホ 大阪店スマホ
6 福岡店 & パソコン 福岡店パソコン
結果
データテーブル
C
450,000
この仮想配列はExcelの内部メモリ上で生成されるため、シート上に作業列を追加する必要はありません。
✅ XLOOKUPならではの利点(他の関数でも&結合は可能だが、これらは不可)
#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~

数式
=XLOOKUP(1, (D:D=A2) * (E:E=B2), F:F, "該当なし")

D列がA2と一致(TRUE=1 / FALSE=0)かつ E列がB2と一致。両方1のとき 1×1=1。検索値を「1」にしてその行を探す。

内部動作:TRUE/FALSE → 0/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
乗算結果が 1 になるのは、すべての条件がTRUEの行だけ。XLOOKUP(1, …) はこの 1 を探し、同じ行のF列(450,000)を返します。
💡 ブール論理の強み:数値条件やOR条件にも対応
・3条件以上:* (G:G>=3) のように * で繋げるだけ。
・OR条件(いずれか一致):+ を使い、=XLOOKUP(1, (D:D=A2) * ((E:E="パソコン")+(E:E="スマホ")), F:F)
・数値の範囲条件(>=, <= 等)を自然に記述可能。&結合では不可能。
&結合 vs ブール論理 ― どちらを使うべきか
データテーブル
比較項目 &結合 ブール論理
可読性 ✅ 高い(直感的) ⚠ やや難解
文字列の完全一致のみ(2条件) ✅ 最適 ○ 使用可能
数値範囲条件(>= 等) ❌ 不可 ✅ 自然に記述可能
OR条件 ❌ 不可 + で記述可能
誤ヒットのリスク ⚠ あり(区切り文字で回避) ✅ なし
処理速度 ✅ やや速い ⚠ やや遅い
結論:文字列の完全一致だけなら「&結合」、数値条件や複雑なロジックが絡むなら「ブール論理」。

🔧 旧バージョンでの代替法(全方式の解説)

ここが重要なポイントです。&結合もブール論理も、INDEX+MATCHやVLOOKUPでも昔から使えます。 ただしExcelのバージョンによってCSEの要否が異なります。以下、方式ごとに正確に整理します。

方式③:INDEX+MATCH &結合 全ver

Excel 2021 / 2024 / Microsoft 365 などの場合:普通の Enter で確定するだけで動作します。

=IFERROR(INDEX(F:F, MATCH(A2 & B2, D:D & E:E, 0)), "該当なし")

Excel 2019 以前の場合:まったく同じ数式ですが、Ctrl+Shift+Enter が必須です。

{=IFERROR(INDEX(F:F, MATCH(A2 & B2, D:D & E:E, 0)), "該当なし")}

※ 波括弧 {} は手入力ではなく、Ctrl+Shift+Enter で自動的に付きます。

書き方はXLOOKUPの&結合と本質的に同じです。 D:D & E:E で仮想的な結合配列を作り、A2 & B2 を検索する仕組みはまったく同じ。違いはCSEの要否と、IFERRORが必要かどうかです。
方式④:INDEX+MATCH ブール論理 全ver

Excel 2021 / 2024 / Microsoft 365 など:

=IFERROR(INDEX(F:F, MATCH(1, (D:D=A2) * (E:E=B2), 0)), "該当なし")

Excel 2019 以前:

{=IFERROR(INDEX(F:F, MATCH(1, (D:D=A2) * (E:E=B2), 0)), "該当なし")}

Ctrl+Shift+Enter で確定が必須。

方式⑤:二重INDEX技 ― CSEを回避する裏技 全ver

2019以前の環境で Ctrl+Shift+Enter を忘れてしまう問題を根本的に回避するため、コミュニティで発見されたテクニックです。 2つ目の INDEX関数を挟むことで、CSE なしで配列を処理させます。

=IFERROR(INDEX(F:F, MATCH(1, INDEX((D:D=A2)*(E:E=B2), 0, 1), 0)), "該当なし")

普通の Enter だけで確定OK。CSE 不要。全バージョンで動作。

二重INDEX技の内部動作フロー
① ブール演算
(D:D=A2)*(E:E=B2)
→ {0,0,1,0,0,0}
2つ目のINDEX
INDEX(…, 0, 1)
配列を「受け取って返す」
→ CSEの代わりに配列を確定
③ MATCH(1, …, 0)
→ 位置「3」を返す
④ INDEX(F:F, 3)
450,000
仕組み:INDEX(配列, 0, 1) は「行番号0(=全行)、列番号1」を意味し、INDEX関数が配列をネイティブに処理してそのまま配列として返すという特性を利用しています。 技術的には内部で配列計算が行われていますが、CSE操作が不要なため「弾丸耐性(bulletproof)」のある数式として知られています。
⚠️ 注意点
・数式が1段深くなるため、可読性はやや低下します。
・内部では配列計算が走っているため、処理速度はCSE配列数式と同等(改善されるわけではない)。
・Excel 2021/2024/Microsoft 365 環境なら不要なテクニックです。レガシー環境向けの知識として理解しておくのが最善。
方式⑥:VLOOKUP + CHOOSE(作業列なしのVLOOKUP多条件) 全ver

VLOOKUPは本来、検索値を1つしか受け取れません。しかし CHOOSE 関数を使ってメモリ上に仮想的な2列テーブルを構築し、その1列目にブール論理の結果(0/1)、2列目に戻り値を配置することで、作業列なしの多条件検索が可能です。

=VLOOKUP(1, CHOOSE({1,2}, (D2:D7=A2)*(E2:E7=B2), F2:F7), 2, 0)

Excel 2019 以前では Ctrl+Shift+Enter で確定が必要。Excel 2021/2024/Microsoft 365 などでは通常の Enter でOK。

CHOOSE が作る仮想テーブルのイメージ
ブール演算の結果
データテーブル
乗算結果
0
0
1
0
0
0
F列(売上)
データテーブル
F
500,000
300,000
450,000
280,000
380,000
220,000
CHOOSE({1,2}, …) で生成される仮想テーブル
データテーブル
列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 全ver

最も古典的で、最も理解しやすい手法。マスタ表の左端に結合キー列を追加し、VLOOKUPで検索します。

作業列を追加(C列に結合キー)
データテーブル
C D E F
1 結合キー(作業列) 店舗 商品名 売上
2 東京店パソコン 東京店 パソコン 500,000
3 東京店スマホ 東京店 スマホ 300,000
4 大阪店パソコン 大阪店 パソコン 450,000
=IFERROR(VLOOKUP(A2 & B2, C:F, 4, FALSE), "該当なし")

CSE不要。全バージョンで動作。ただし作業列(C列)の追加・維持が必要。

✅ この方式のメリット
CSEが一切不要(配列計算をしないため)
処理速度が速い(メモリ上に仮想配列を生成しない)
数式がシンプルで、VLOOKUP を知っている人なら誰でも理解できる
・全バージョンで安定動作
⚠️ デメリット
・元データの構造を変更する必要がある(列の挿入)
・データ行が増えるたびに作業列の数式をコピーする必要がある
・ファイルサイズが増加する
・VLOOKUPの列番号指定により、列の挿入・削除でズレるリスクがある
方式⑧:AGGREGATE(CSE不要・2010以降) 2010~

Excel 2010 で追加された AGGREGATE 関数は、配列を引数に受け取れるため CSE なしで多条件検索が可能です。 CSE配列数式のフリーズ問題を回避する手段として、2010〜2019 の環境で重宝されてきました。

=IFERROR(INDEX(F:F, AGGREGATE(15, 6, ROW(D2:D7)/((D2:D7=A2)*(E2:E7=B2)), 1)), "該当なし")

AGGREGATE(15, 6, …, 1) = SMALL関数相当(エラー無視モード)。
条件に一致しない行は 0 で除算されるため #DIV/0! になり、AGGREGATE のエラー無視機能(第2引数=6)で自動的にスキップされます。

AGGREGATE 方式の内部動作
データテーブル
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!(除外)
AGGREGATE(15, 6, …, 1) は「エラーを無視して最小値を返す」。結果は行番号 4
INDEX(F:F, 4) = 450,000
💡 AGGREGATE の強み
・CSE 完全不要で2010以降の全バージョンで動作
AGGREGATE(15,6,…,ROWS($A$1:$A1)) のように k 値を連番にすると、複数のヒット行を順番に取得できる(MATCH にはできない)
・ただし数式が長く難解になりやすいため、2021/2024/Microsoft 365 環境なら XLOOKUP や FILTER 関数を使うべき

⚠️ CSE配列数式(Ctrl+Shift+Enter)の限界と問題点

方式③④⑥で必要となるCSE配列数式は、数多くの深刻な制約と落とし穴を抱えています。 XLOOKUPをはじめとする新しい動的配列関数が登場した最大の理由が、これらの問題を根本的に解消するためでした。

CSE配列数式の歴史的変遷
Excel 97 〜 2019
CSE配列数式が必須
Ctrl+Shift+Enter で確定
Excel 2021
動的配列エンジン導入
CSE 不要に
Excel 2024 / Microsoft 365
関数ごとに差はあるが
新関数の対応範囲が広い
❌ 限界①:Ctrl+Shift+Enter の入力忘れ
通常の Enter だけで確定すると、配列として処理されず全く別の結果や #VALUE! エラーが返ります。 数式バーを見ても波括弧 {} が付いていないことに気づかないまま運用されるケースが多く、サイレントなデータ事故の温床です。
❌ 限界②:編集するとCSEが外れる
セルを編集して普通に Enter で確定すると、CSE状態が解除されて壊れます。 CSEを知らない後任者がファイルをメンテナンスすると確実に問題が発生します。
❌ 限界③:処理速度が深刻に遅い
数式が入っているセルの数だけ、配列全体の計算を毎回繰り返します。 1万行のマスタに対してCSE数式を1,000行にコピーした場合、のべ数千万回の計算が発生し、ブック全体がフリーズすることもあります。
❌ 限界④:列全体参照が危険
D:D のような列全体参照を使うと、約104万行分の配列がメモリに展開され、極端に遅くなるかフリーズします。 CSEでは D2:D10000 のように範囲を限定するのが実務ルールでした。
❌ 限界⑤:他の人が理解できない(属人化)
波括弧の意味、なぜ Ctrl+Shift+Enter が必要なのか、なぜ普通の Enter だと壊れるのか。 独学では到達しにくい知識のため、作成者の異動・退職後にメンテナンス不能になる典型パターンです。
❌ 限界⑥:配列の一部だけ削除・変更不可
CSE配列数式が複数セルにまたがっている場合、一部のセルだけを削除・変更できません。「配列の一部を変更することはできません」エラーが発生します。
処理速度の比較フロー(マスタ10,000行 × 数式1,000行)
▼ XLOOKUP &結合(2021以降)
各セルの計算
内部で結合配列を生成→検索
動的配列エンジンが最適化
×
1,000セル
▼ CSE配列数式(2019以前)
各セルの計算
①10,000個のTRUE/FALSE配列を生成×条件数
②10,000回の乗算
③MATCHで10,000個を走査
④メモリに一時配列を確保→破棄
×
1,000セル(毎回ゼロから)
🔴 CSEが遅い核心的な理由:各セルが「配列全体を生成して評価する」処理を独立して毎回ゼロから行うため。 動的配列エンジン(2021/2024/Microsoft 365)はメモリ管理と計算キャッシュの効率が根本的に異なります。
実務での体感速度の目安
データテーブル
データ規模 CSE配列数式 XLOOKUP
&結合
作業列
+VLOOKUP
AGGREGATE
マスタ100行 × 数式10行 一瞬 一瞬 一瞬 一瞬
マスタ10,000行 × 数式1,000行 数秒〜十数秒 ✅ 一瞬〜1秒 ✅ 一瞬〜1秒 ○ 数秒
マスタ100,000行 × 数式10,000行 🔴 数十秒〜数分 ✅ 数秒 ✅ 数秒 ⚠ 十数秒
マスタ500,000行以上 🔴 実用困難 ✅ 十数秒 ○ 数秒〜十数秒 ⚠ 厳しい
※ 環境(CPU・メモリ・Excel バージョン)により大きく変動します。相対的なイメージです。
→ 詳細なベンチマーク比較は 速度カテゴリ を参照。
✅ 新関数(XLOOKUP等)で解消されたこと
Ctrl+Shift+Enter が完全に不要
・編集後も配列計算が壊れない
・処理速度が劇的に改善
・列全体参照(D:D)が安全に使える
・可読性が大幅に向上
・スピル展開で数式1本から複数セルに結果が出せる
⚠️ CSEの知識が依然必要なケース
・社内にExcel 2019以前のPCが残る場合
・既存ファイルの保守(レガシーファイルの理解)
・新関数は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時は遅い ✅ 高速 ○ 中程度
可読性 ✅ 高い ○ やや難解 ○ 普通 ❌ 難解 ❌ 非常に難解 ✅ 高い ❌ 難解
複数列返却 ✅ スピル ✅ スピル ❌ 列ごと ❌ 列ごと ❌ 列ごと ❌ 列ごと ❌ 列ごと
✅ 結論:Excel 2021/2024/Microsoft 365 が使えるなら方式①(XLOOKUP &結合)が第一選択。 数値範囲条件が絡むなら方式②(ブール論理)。 2019以前の環境では方式⑤(二重INDEX技)方式⑦(作業列)が安全。 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(バイナリ検索)を指定しても正しく動作しない可能性があります。