XLOOKUPは単一条件だけでなく複数条件の検索にも使えます。主に「ブール積(AND)」で一時配列を作る方法と、文字列連結(&)でキーを作る方法の2通りがあります。用途とデータ構造に応じて使い分けると柔軟で高速な検索を実装できます。
クイックリンク
XLOOKUPの構文と単一条件の例
例1: ブールロジックを使った複数条件のXLOOKUP
例2: 連結を使った複数条件のXLOOKUP
導入:XLOOKUPは、従来のVLOOKUPやINDEX+MATCHに代わる強力な検索関数です。多くの解説は単一の検索値を想定しますが、XLOOKUPは工夫次第で複数の条件に基づく検索にも対応できます。この記事では、デスクトップ版Excel(Excel 2021以降、Microsoft 365を含む)やWeb・モバイル版で利用できるXLOOKUPの多条件検索の方法を、実例と共にわかりやすく解説します。
重要: XLOOKUP自体はExcelのバージョンやプラットフォームにより利用可能性が異なります。Excel 2019以前の永続ライセンスではXLOOKUPがないため、代替はINDEX/MATCHやFILTER関数の組み合わせになります。
XLOOKUPの構文と単一条件の例
XLOOKUPの構文は一見複雑ですが順序立てて理解すると論理的です。
=XLOOKUP(*a*,*b*,*c*,*d*,*e*,*f*)
ここでの引数は次の通りです。
- a(必須): 検索値(lookup value)
- b(必須): 検索範囲(lookup array)
- c(必須): 返却範囲(return array)
- d(省略可): 見つからない場合に返すテキスト(例: “No match”)
- e(省略可): マッチモード(0 = 完全一致(既定)、-1 = 完全一致または一つ小さい値、1 = 完全一致または一つ大きい値、2 = ワイルドカード)
- f(省略可): 検索モード(1 = 上から下へ(既定)、-1 = 下から上へ、2 = bが昇順の2分探索、-2 = bが降順の2分探索)
例: データ検証でセルE1にIDを選択した場合、次の式で対応するスコアを返します。
=XLOOKUP(E1,T_Scores[ID],T_Scores[Score],"No match",0,1)
この式の意味(主要点)は以下の通りです。
- E1は検索する値。
- T_Scores[ID]がID列を検索する範囲。
- T_Scores[Score]が対応するスコアを返す範囲。
- “No match”は見つからない場合の戻り値。
- 0は完全一致を指定。
- 1は上から下への検索を指定。
最後の2つの引数は省略可能で、完全一致かつ上から下への検索が既定値です。
例1: ブールロジックを使った複数条件のXLOOKUP
複数条件でXLOOKUPを使う場合、最も一般的で柔軟なのはブール演算(TRUE/FALSE を 1/0 に変換して掛け合わせる方法)です。ここでは、飲料ブランドが6種類・国が6か国あり、各飲料×国ごとにマネージャーと売上が割り当てられている表を想定します。
目標: 「飲料」と「国」を入力すると、対応するマネージャー名と売上を返す仕組みを作る。
XLOOKUPは通常1つの検索値で動作しますが、ブールロジックを使うと一時配列を作れます。以下がその例です(読みやすく改行しています)。
=XLOOKUP(
1,
(T_Managers[Drink]=G1)*(T_Managers[Country]=G2),
T_Managers[[Manager]:[Sales]],
"No result"
)
ポイントの解説:
- 引数b(lookup array)である
(T_Managers[Drink]=G1)*(T_Managers[Country]=G2)
は、それぞれの条件に対してTRUE/FALSEの配列を作り、掛け算(*)で要素ごとに乗算します。ExcelではTRUEは1、FALSEは0として扱われるため、両方の条件を満たす行だけが1になります(AND条件)。
ステップごとのイメージ:
- T_Managers[Drink]=G1 が {FALSE; FALSE; …; TRUE; TRUE; …} のような配列を生成。
- T_Managers[Country]=G2 が {FALSE; TRUE; …; TRUE; …} のような配列を生成。
- それらを掛け合わせると {0;0;…;1;0;…} となり、1が該当行を示す。
XLOOKUPの検索値(引数a)に1を指定しているため、この1を最初に見つけた行を返します。返却範囲(引数c)はテーブルの複数列を指定できるので、マネージャー名と売上の両方が同時に返せます。
実務ノート:
- 比較演算子は = の他に >, <, >=, <= が使えます(数値条件の場合)。
- 条件を『いずれか満たす(OR)』にしたいときは、掛け算ではなく足し算(+)を使い、最初に0以外(つまり1以上)になる行を返すロジックを作ります。ただし足し算の場合は合致件数が2以上なら合算値が2以上になるため、検索値は1ではなく “1” 以上を検出するロジックやMATCH代替を考える必要があります。
パフォーマンスの注意点:
- 大きなデータセット(数万行)で複数の配列演算を行うと計算負荷が高くなります。必要に応じてテーブルを絞り込む、予めキー列を作る(後述の連結法)などの工夫を検討してください。
例2: 連結を使った複数条件のXLOOKUP
別の一般的な方法は、検索キーとなる文字列を作るために列を連結する方法です。連結(&)を使えば単純にキーを作れるため、理解とデバッグが容易です。
同じシナリオで、飲料と国を入力してマネージャーと売上を返す式は次の通りです。
=XLOOKUP(
G1&G2,
T_Managers[Drink]&T_Managers[Country],
T_Managers[[Manager]:[Sales]],
"No result"
)
ポイント:
- 引数a は G1&G2 により『CoffeeSpain』のような文字列を作成。
- 引数b は各行で T_Managers[Drink]&T_Managers[Country] を作り、『Apple juiceAustralia』『CoffeeSpain』といった文字列列を生成。
- その中から一致する文字列を探して、対応する行のManagerとSalesを返す。
利点と欠点:
- 利点: 実装がシンプルで直感的。計算負荷はブール積に比べて軽い場合が多い。
- 欠点: 結合したキーがデータ内で一意であることが前提。値の前後に余分なスペースがあると一致しないため、TRIM関数等で前処理が必要。
実務のヒント:
- 文字列を連結する際は区切り文字(例: “|” や “—“)を入れると、『12』+『34』と『1』+『234』のような衝突を避けられます。例: G1&”|”&G2 とデータ列で Drink&”|”&Country のように揃える。
- 日付や数値を含む場合はTEXT関数でフォーマットを揃えると安全です(例: TEXT(A1,”yyyy-mm-dd”) など)。
どちらの手法を選ぶべきか — 比較と判断フレームワーク
ここでは、ブール演算(AND)と連結(キー作成)を比較する表と、選択のための簡単な意思決定フローチャートを提示します。
比較マトリクス(概観):
- 柔軟性: ブール演算 > 連結(比較演算子や複雑条件に強い)
- 実装の単純さ: 連結 > ブール演算
- パフォーマンス(大規模データ): 連結(事前キー列あり) >= ブール演算(配列計算が重い)
- 可読性: 連結 > ブール演算(特に非Excelの読者に優しい)
意思決定フロー(要点):
- 条件が等価比較だけか?→ 連結が簡単
- 条件に範囲比較(>、<)や論理混合があるか?→ ブール演算が適切
- データ量が大きく、高速性が必須か?→ 事前にキー列を作成して連結で検索(インデックス的利用)
以下はMermaidで示した簡易フローチャート(表示できる環境で有効)。
flowchart TD
A[開始] --> B{条件の種類は?}
B -->|単純な等価比較のみ| C[連結(キー作成)]
B -->|範囲比較や複雑条件| D[ブール演算(AND/OR)]
C --> E{データ量は大きいか}
E -->|はい| F[事前にキー列を作りXLOOKUP]
E -->|いいえ| G[連結でXLOOKUP]
D --> H[ブール式で一時配列を作る]
F --> I[運用テスト]
G --> I
H --> I
I --> J[完了]
よくある失敗例と回避策
- 空白・余計なスペース: 連結法でマッチしない主因。対策: TRIM関数で前処理。
- データ型の不一致: 数値と文字列が混在すると一致しない。対策: VALUE/TEXTで型を統一。
- 複数行ヒット: 連結が一意でないと複数一致があり得る。対策: データの一意性を担保、あるいはFILTERで複数行を扱う。
- パフォーマンス問題: 大規模データでブール演算を多用すると再計算が重くなる。対策: 効率化(キー列、テーブル絞り込み、計算の段階的実行)。
追加の実用例と応用
OR条件で最初に合致する行を取得したい場合: ブール配列を+演算で合成し、MATCHやXLOOKUPで “>=1” 相当を探すロジックを作る。例: XLOOKUP(1, (cond1)+(cond2), … ) のままでは配列の値が2になる可能性があるため、MATCH/INDEXの工夫が必要になります。
部分一致やワイルドカード: XLOOKUPのe引数でワイルドカードマッチ(2)を使うか、FILTERと組み合わせてLIKE的な処理を実現。
複数列を返す: XLOOKUPは返却範囲に複数列を指定でき、スピル(動的配列対応)するため、マネージャー名と売上を同時に返して別々のセルに自動展開できます(対応バージョンでのみ)。
実装SOP(簡易プレイブック)
- データをテーブルに変換する(Ctrl+T推奨)。テーブル名と列名を明確にする。
- どの条件が等価比較か範囲比較かを判断する。
- 等価比較のみでかつ一意キーが作れる場合は連結法を選ぶ。データ量が大きければ事前にキー列を追加してインデックス化する。
- 範囲比較や複雑条件がある場合はブール演算を使って一時配列を作る。
- 発見時の戻り値(Not Found)を定義し、ユーザー向けのメッセージにする(例: “該当なし”)。
- テストケースを作り、境界値(最初の行、最後の行、一致なし、複数一致)で動作確認。
- ドキュメント化してメンテ担当に周知する。
テストケースと受け入れ基準
- テスト1: 正常系 — 既存の飲料と国の組合せでマネージャーと売上が正しく返る。
- テスト2: 存在しない組合せ — “No result” または定義したメッセージが返る。
- テスト3: 空白や前後スペースを含む入力 — TRIM処理の有無で結果が変わらない。
- テスト4: 複数一致が存在する行 — 期待する方針(最初に見つかった行を返す/全件返却する)に沿っている。
受け入れ基準:
- すべての正常系ケースで正しい行が返ること。
- 境界ケースで明確なエラーメッセージが表示されること。
- パフォーマンスが要件を満たすこと(例: 応答遅延が業務許容範囲内)。
ロール別チェックリスト
- アナリスト: データの一意性をチェック。キー列が必要か判断。
- エンドユーザー(報告者): データ入力の形式(スペース/フォーマット)を守るための簡易ガイドを参照。
- 開発者/管理者: 計算負荷の監視、テーブル設計、関数のメンテナンス。
1行用語集
- スピル: 動的配列結果が隣接セルへ自動展開される現象。
- テーブル参照: TableName[Column] のようにExcelのテーブルを参照する構文。
- ブール配列: TRUE/FALSE を 1/0 に扱うことで配列計算に利用する手法。
エッジケースギャラリー
- 日付や時刻が含まれる列を連結する際、表示形式が異なると一致しない。対処: TEXT関数で統一。
- NULLや空文字が混在する列で連結すると “Apple|” と “|Australia” のような不整合が起きる。対処: 空値を置換してから連結する。
- Unicodeや全角半角の違いによる不一致。対処: NORM.SPACE相当の前処理(ExcelではASC/UNICODE系関数の利用やPower Queryの正規化)。
ベストプラクティスまとめ
- データは必ずテーブル化する。列名を明確化し、構造参照(Table[Column])を使うと式が読みやすい。
- 一意キーが作れるなら事前にキー列を作り連結法で検索すると高速で安定する。
- 範囲条件や複雑条件がある場合はブール配列で柔軟に処理する。
- 大規模データでは計算負荷を監視し、必要ならPower QueryやSQL・BIツールの利用を検討する。
まとめ: XLOOKUPは適切なパターンを知っていれば、1つの関数で複数条件の検索を実現できます。シンプルな等価比較には連結法、複雑な論理条件や比較が必要な場合にはブール演算を使い、データ量やパフォーマンス要件に応じて最適な方法を選んでください。
重要: この記事で示した構文や考え方は、Excelのバージョンや設定によって挙動が異なる場合があります。実運用で導入する際は小さなデータセットで動作検証を行ってください。