XLOOKUPの複数条件|2つ・3つ以上・OR条件の書き方と無料サンプル

Excel XLOOKUPで複数条件を検索 2つ・3つ以上・OR 無料サンプル付き

XLOOKUP関数で複数の条件を指定するには、検索値と検索範囲をそれぞれ「&」でつなぎます。支店がE2、商品がF2なら =XLOOKUP(E2&F2,A2:A7&B2:B7,C2:C7) です。「〜以上」のような条件を含むときは、条件どうしを掛け算して「1」を探す =XLOOKUP(1,(条件1)*(条件2),戻り範囲) を使います。

目次

【無料】XLOOKUPの複数条件を試せる練習用Excelファイル

サンプルファイル「まず試す」シートの画面。E2とF2の2つの条件で売上を検索している
記事の7つの数式がすべて入力済み。黄色いセルを書き換えるだけで試せます。
・まず試す:2つの条件/INDEX+MATCH
・応用:3つ以上/以上・以下/OR/FILTER
・別シート:他のシートの表から検索
対応:Microsoft 365・Excel 2021・2024・Web版(2019以前は後半の「XLOOKUPが使えない場合」へ)

まず動かしてみよう|この記事のサンプルをその場で試せます

練習用ファイルをダウンロードしなくても、記事と同じデータ・同じセル番地のサンプルをここで動かせます。黄色いセルを書き換えると、結果がその場で変わります。各解説の最後にある「▶ この式を試す」を押すと、このツールの該当セルへ移動します。

2つの条件で検索する:検索値と検索範囲を「&」でつなぐ

XLOOKUPの検索値と検索範囲には、本来1つずつしか指定できません。そこで「支店」と「商品」を&でつなぎ、「大阪りんご」のような1つの文字列にしてから探します。検索範囲の側も同じように、支店の列と商品の列を1行ずつつないでおきます。

サンプルの「まず試す」シートでは、A2:C7が元の表、E2が支店、F2が商品です。G2に次の式を入れると、大阪のりんごの売上「150」が表示されます。

G2に入力(2つの条件で検索)
=XLOOKUP(E2&F2,A2:A7&B2:B7,C2:C7,"該当なし")
ひとことで検索値も検索範囲も「&」でつないで、1つの文字列どうしで探す
E2&F2
検索値。E2「大阪」とF2「りんご」をつないで「大阪りんご」にします
A2:A7&B2:B7
検索範囲。支店と商品を1行ずつつなぎ、「東京りんご」「東京みかん」…の6つにします
C2:C7
戻り範囲。見つかった行の売上を返します
"該当なし"
見つからないときに表示する文字(第4引数)
データの流れ
① 検索値をつなぐ
E2大阪F2りんご → 大阪りんご
▼
② 検索範囲もつないで、同じ文字列を探す(上から3番目)
東京りんご東京みかん大阪りんご大阪みかん名古屋りんご名古屋みかん
▼
③ 3番目の行の売上を返す結果
G2150

第4引数の "該当なし" は、条件に合う行がないときの表示です。省略すると #N/A エラーになります。空白や0を表示したい場合はXLOOKUPで見つからない場合の表示を変える方法をご覧ください。

3つ以上の条件も「&」を増やすだけ

条件が3つ、4つと増えても考え方は同じです。検索値と検索範囲に、同じ順番で&を1つずつ足していきます。「応用」シートでは、支店・商品・月の3つで売上を探しています。

「応用」シートのJ2に入力(3つの条件)
=XLOOKUP(G2&H2&I2,A2:A9&B2:B9&C2:C9,D2:D9,"該当なし")
ひとことで条件が増えても、&で1つずつ足していくだけ
G2&H2&I2
検索値。支店・商品・月をつないで「大阪りんご5月」にします
A2:A9&B2:B9&C2:C9
検索範囲。検索値と同じ順番で3つの列をつなぎます
D2:D9
戻り範囲。見つかった行の売上を返します
データの流れ
① 検索値をつなぐ
G2大阪H2りんごI25月 → 大阪りんご5月
▼
② 検索範囲の中から同じ文字列を探す(上から6番目)
東京りんご4月東京みかん4月大阪りんご4月大阪みかん4月東京りんご5月大阪りんご5月東京みかん5月大阪みかん5月
▼
③ 6番目の行の売上を返す結果
J2160

検索値と検索範囲は、必ず同じ順番でつなぎます。検索値が「支店&商品&月」なのに検索範囲が「商品&支店&月」だと、文字列が一致せず見つかりません。

読むより、手を動かすほうが早く覚えられます。
サンプルの「まず試す」シートで、F2を「みかん」に書き換えてみてください。G2が「90」に変われば成功です。

「〜以上」「〜以下」を含む条件は掛け算で指定する

&でつなぐ方法は「完全に一致する」条件にしか使えません。「売上が155以上」のような比較を含むときは、条件ごとにTRUE/FALSEを作り、掛け算します。TRUEは1、FALSEは0として計算されるので、すべての条件を満たす行だけが1になります。その「1」をXLOOKUPで探すのがポイントです。

「応用」シートのJ5に入力(「〜以上」を含む条件)
=XLOOKUP(1,(A2:A9=G5)*(D2:D9>=H5),C2:C9,"該当なし")
ひとことで条件ごとにTRUE/FALSEを作って掛け算し、両方満たす行の「1」を探す
(A2:A9=G5)
支店がG5「大阪」かどうか。8行それぞれがTRUEかFALSEになります
(D2:D9>=H5)
売上がH5「155」以上かどうか。こちらも8行分のTRUE/FALSE
*
掛け算するとTRUE×TRUEの行だけ1、それ以外は0になります
1
第1引数(検索値)。掛け算の結果から「1」を探します
C2:C9
戻り範囲。見つかった行の月を返します
データの流れ
① 支店が大阪か(上から8行、T=TRUE・F=FALSE)
FFTTFTFT
▼
② 売上が155以上か
FFFFFTFF
▼
③ 掛け算すると、6番目だけ1になる
00000100
▼
④ 6番目の行の月を返す結果
J55月

「〜以下」なら <=、「〜より大きい」なら > に変えるだけです。条件を3つ以上にしたいときは、*(条件3) のように掛け算を続けます。

OR条件(どれかに当てはまる)は足し算で指定する

「商品がみかん、または売上が150以上」のように、どれか1つでも当てはまればよい場合は、条件を足し算します。両方当てはまる行は2になるので、>0 でTRUE/FALSEに戻し、TRUEを探します。

「応用」シートのJ8に入力(どれかに当てはまる:OR)
=XLOOKUP(TRUE,((B2:B9=G8)+(D2:D9>=H8))>0,A2:A9,"該当なし")
ひとことで足し算すると、どちらか一方でも満たせば1以上。>0でTRUEに戻して探す
(B2:B9=G8)
商品がG8「みかん」かどうか
(D2:D9>=H8)
売上がH8「150」以上かどうか
+ … >0
足し算の結果が0より大きい(どちらかを満たす)行がTRUEになります
TRUE
第1引数。最初のTRUEの行を探します
A2:A9
戻り範囲。見つかった行の支店を返します
データの流れ
① 商品がみかんか(上から8行)
01010011
▼
② 売上が150以上か
00100100
▼
③ 足して0より大きいか(T=TRUE) → 最初のTRUEは2番目
FTTTFTTT
▼
④ 2番目の行の支店を返す結果
J8東京

別シートの表から複数条件で検索する

元の表が別のシートにある場合も、式の形は変わりません。範囲の前に「シート名!」が付くだけです。式の入力中に元の表のシート見出しをクリックして範囲を選べば、シート名は自動で入ります。

「別シート」のC2に入力
=XLOOKUP(A2&B2,まず試す!A2:A7&まず試す!B2:B7,まず試す!C2:C7,"該当なし")
ひとことで範囲の前に「シート名!」が付くだけで、式の形は同じ
A2&B2
このシートで入力した支店と商品をつなぎます(名古屋みかん)
まず試す!A2:A7&まず試す!B2:B7
「まず試す」シートの支店と商品をつないだもの
まず試す!C2:C7
「まず試す」シートの売上
データの流れ
① このシートの検索値をつなぐ
A2名古屋B2みかん → 名古屋みかん
▼
② 「まず試す」シートで同じ文字列を探す(上から6番目)
東京りんご東京みかん大阪りんご大阪みかん名古屋りんご名古屋みかん
▼
③ 6番目の行の売上を返す結果
C260

条件に合うデータが複数あるときはFILTER関数

XLOOKUPが返すのは、上から探して最初に見つかった1件だけです。「応用」シートでは、大阪のりんごは4月の150と5月の160の2件ありますが、XLOOKUPで支店と商品だけを条件にすると150しか出てきません。当てはまるものをすべて取り出したいときは、FILTER関数を使います。

「応用」シートのJ11に入力(当てはまるものをすべて)
=FILTER(D2:D9,(A2:A9=G11)*(B2:B9=H11),"該当なし")
ひとことでXLOOKUPは最初の1件だけ。すべて取り出したいときはFILTER
D2:D9
取り出す範囲(売上)
(A2:A9=G11)
支店がG11「大阪」かどうか
(B2:B9=H11)
商品がH11「りんご」かどうか。掛け算で両方満たす行だけ1になります
データの流れ
① 掛け算の結果(上から8行)
00100100
▼
② 1の行の売上を、すべて下へ並べる結果
J11150J12160

FILTER関数の条件の書き方はFILTER関数の複数条件(AND・OR)、3つ以上の条件はFILTER関数で3つ以上の複数条件を指定する方法で詳しく解説しています。

うまく検索できないときの確認ポイント

&でつなぐ方法には、別々の値が偶然同じ文字列になってしまう落とし穴があります。たとえば「A1」と「23」も「A12」と「3」も、つなぐとどちらも「A123」です。この場合、正しい行とは違う行の値が返ってきます。品番や数字のコードをつなぐときは、間に「|」などの区切り文字をはさみます。

区切り文字「|」をはさむ書き方
=XLOOKUP(E2&"|"&F2,A2:A7&"|"&B2:B7,C2:C7,"該当なし")
ひとことでつなぐ間に「|」をはさむと、別々の値が偶然同じ文字列になるのを防げる
"|"
検索値と検索範囲の両方に、同じ区切り文字をはさみます。データに出てこない文字なら「|」以外でもかまいません
補足「A1」&「23」と「A12」&「3」は、どちらも「A123」になってしまいます。「|」をはさめば「A1|23」と「A12|3」になり、区別できます
症状よくある原因対処
データはあるのに「該当なし」前後の余分なスペース、全角と半角の違いTRIM関数でスペースを削除する、全角・半角をそろえる
数字のコードが一致しない&でつなぐと数値は文字列になる。「003」(文字列)と 3(数値)は別物表示形式ではなく、値そのものの形をそろえる
違う行の値が返るつないだ文字列が偶然同じになっている上の式のように「|」をはさむ
#VALUE! エラー検索範囲と戻り範囲の行数が違うA2:A7 と C2:C7 のように同じ行数にする
#NAME? エラーXLOOKUPがないバージョン(Excel 2019以前)下のINDEX+MATCHを使う

スペースの削除は空白(スペース)を削除する方法、全角・半角は全角⇔半角を一括変換する方法、先頭の0の扱いは先頭の0が消えるときの対処法が参考になります。

XLOOKUPが使えない場合はINDEX+MATCH

XLOOKUP関数が使えるのは、Microsoft 365、Excel 2021、Excel 2024、Web版のExcelです。Excel 2019以前では #NAME? エラーになるため、INDEX関数とMATCH関数を組み合わせます。サンプルの「まず試す」シートのG5に入っています。

「まず試す」シートのG5(XLOOKUPがない場合)
=INDEX(C2:C7,MATCH(1,INDEX((A2:A7=E2)*(B2:B7=F2),0),0))
ひとことで掛け算で1になる行の位置をMATCHで調べ、INDEXでその行の売上を取り出す
(A2:A7=E2)*(B2:B7=F2)
支店と商品の両方が一致する行だけ1になります
INDEX( … ,0)
配列のまま計算させるための書き方。Ctrl+Shift+Enterなしで動きます
MATCH(1, … ,0)
1が上から何番目にあるかを調べます
INDEX(C2:C7, …)
その番目の売上を返します。見つからないと #N/A になるので、必要ならIFERRORで囲みます
データの流れ
① 掛け算の結果(上から6行)
001000
▼
② MATCHで1の位置を調べる
3番目
▼
③ INDEXで3番目の売上を返す結果
G5150

INDEX+MATCHでの複数条件は、INDEX+MATCHで複数条件検索する方法で3条件の例まで詳しく解説しています。

この記事の数式は、すべて練習用ファイルに入っています。
自分の表に使う前に、サンプルで動きを確かめておくと安心です。

まとめ

やりたいこと数式の形
2つの条件=XLOOKUP(E2&F2,A2:A7&B2:B7,C2:C7)
3つ以上の条件=XLOOKUP(G2&H2&I2,A2:A9&B2:B9&C2:C9,D2:D9)
「〜以上」などを含む=XLOOKUP(1,(条件1)*(条件2),戻り範囲)
どれかに当てはまる(OR)=XLOOKUP(TRUE,((条件1)+(条件2))>0,戻り範囲)
当てはまるものをすべて=FILTER(戻り範囲,(条件1)*(条件2))
XLOOKUPがない=INDEX(戻り範囲,MATCH(1,INDEX((条件1)*(条件2),0),0))

XLOOKUPとIF関数を組み合わせて表示を切り替えたい場合はXLOOKUPとIFの組み合わせ、文字の一部で検索したい場合はXLOOKUPの部分一致も参考にしてください。関数の仕様はMicrosoftのXLOOKUP関数の説明でも確認できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次