いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)XLOOKUP関数で複数条件(AND,OR)を指定する方法

 ExcelのXLOOKUP関数で、AND条件(かつ)やOR条件(または)を指定して検索・抽出する方法です。クロス抽出についても併せて紹介します。

  • 第2引数(検索範囲)で複数列の値を&でつないで指定することで、複数の列に対するAND条件にできます。
  • 第2引数内で「*」や「+」を使った論理演算を用いることでAND/OR条件を指定できます。

AND条件(かつ)を指定する方法

 次の画像の表ではB列の建物名だけでも、C列の部屋番号だけでも入居者を特定できず、両方の値が揃ってはじめて入居者を特定できるようになっています。
 一方でF列からH列は検索欄になっており、F3セルには建物名が、G3セルには部屋番号が入力されています。
 XLOOKUP関数では検索値が1つしか指定できないのでちょっと厄介ですが、次のような式で抽出しています。

 H3セル

=XLOOKUP(F3&G3,B3:B8&C3:C8,D3:D8)

 第1引数(検索値)として「F3&G3」と、建物名と部屋番号の2つの値を連結した1つの値を指定します。第2引数(検索範囲)でも「B3:B8&C3:C8」と、2つの列を連結したものを指定します。これで建物名と部屋番号がF3,G3セルの値と(両方とも)一致する入居者を抽出できます。

 注意点として、この方法(式)だと「建物名が『A』で部屋番号が『AA』の部屋」と、「建物名が『AA』で部屋番号が『A』の部屋」を区別できません(どちらも連結すると「AAA」になるためです)。意図しない限り起こらないような事態なのであまり気にする必要はありませんが、これを防ぐ場合には次のような式にするのが1つの方法です。

=XLOOKUP(F3&"_"&G3,B3:B8&"_"&C3:C8,D3:D8)

 


 次の画像ではF3:G5の範囲に3組の検索値が入力されていますが、第1引数(検索値)の範囲を拡大することにより1つの式で3つの検索結果を得ています。

 H3セル

=XLOOKUP(F3:F5&G3:G5,B3:B8&C3:C8,D3:D8)

 


 次はもう1つのやり方です。
 H3セルに上記の方法とは異なる式を入力して、同じ結果を得ています。

 H3セル

=XLOOKUP(TRUE,(B3:B8=F3)*(C3:C8=G3)>0,D3:D8)

 第2引数で「*」演算子を使い、各条件が真(TRUE)なら1、偽(FALSE)なら0とみなす掛け算を行っています。これを利用して両方の条件が真となる行を「TRUE」、そうでない行を「FALSE」に変換した配列を生成し、「TRUE」を検索して対応する入居者の氏名を抽出しています。
 意表を突く内容ですが、不等号や関数を使ったり、OR条件(後述)との複合条件など複雑な条件が可能になります。また、文字列の結合に頼らないので、意図しない値を偶然抽出すること(上記注意点参照)が絶対にありません。



 ただしこの方法の場合、最初の例のように検索値を拡張することができないのが欠点です。
 そこで次の画像では、絶対参照を使った式をフィルコピーすることで3つの検索結果を得ています。

 H3セル(H5セルまでフィルコピー)

=XLOOKUP(TRUE,(B$3:B$8=F3)*(C$3:C$8=G3)>0,D$3:D$8)

OR条件(または)を指定する方法

 指定した条件のいずれかを満たすものを抽出する例です。
 次の画像のデータは上記の例と全く同じものですが、こちらでは指定した建物名と部屋番号のうちどちらかを満たすもの(のうち最も上にあるもの)を抽出しています。

 H3セル

=XLOOKUP(TRUE,(B3:B8=F3)+(C3:C8=G3)>0,D3:D8)

 こちらでは「+」を使い、各条件が真(TRUE)なら1、偽(FALSE)なら0とみなす足し算を行っています。両方の条件が真なら1+1=2に、一方だけ真なら1に、両方とも偽の場合は0になります。これを利用していずれかの条件が真となる行を「TRUE」、そうでない行を「FALSE」に変換した配列を生成し、「TRUE」を検索して対応する入居者の氏名を抽出しています。
 いずれかの条件に該当する行は4つありますが、XLOOKUPの仕様により最も上にある値が抽出されています。
 

1つの列に複数の検索値を設定する場合

 次の画像では、1つの列に2つの検索値を設定して検索し、いずれか上にある方の価格を取得しています。

 G3セル

=XLOOKUP(TRUE,(B3:B9=E3)+(B3:B9=F3)>0,C3:C9)

 考え方としては上記例と同様で、2つの条件をいずれもB列に課しているだけの違いです。

検索範囲を複数列にする場合

 検索範囲として複数の列を検索し、いずれかの列に該当する値があれば対応する行の値を取得するというケースです。OR条件としては最も実用的なケースかと思います。
 次の画像ではF3セルに入力された担当者名をB列とC列の2つの列から検索し、対応する担当地区を取得しています。

 G3セル

=XLOOKUP(TRUE,(B3:B6=F3)+(C3:C6=F3)>0,D3:D6)

 これもやっていることは上記例とほぼ同じで、1つの条件を2つの列に課しているだけの違いです。

 ちなみに、この検索に関しては次の記事で注意点を含めて掘り下げていますので参考まで。

(Excel)XLOOKUP関数で検索範囲に複数列を指定する - いきなり答える備忘録

条件が3つ以上の場合

 条件が3つ以上の場合でも上記の方法で対応できます。
 次の画像はAND条件で条件を3つにした例です。

 J3セル

=XLOOKUP(G3&H3&I3,B3:B10&C3:C10&D3:D10,E3:E10)

 全く簡単で、条件が増えるごとに「&」でつなぐ対象を増やしていけばいいだけです。



 次の画像も全く同じ内容ですが+演算子を利用した式を使用しています。

 J3セル

=XLOOKUP(TRUE,(B3:B10=G3)*(C3:C10=H3)*(D3:D10=I3)>0,E3:E10)

 これも条件が増えるごとに「*(条件式)」を増やしていけばいいだけです。
 また、「*」を「+」に代えればOR条件になります。実例は省略しますが「*」と「+」を組み合わせてANDとORの複合条件を設定できるのもポイントです。

ワイルドカード(あいまい検索)の複数条件

 複数のワイルドカードを指定し、すべてまたはいずれかに該当する値を検索する方法についてです。ここではワイルドカードとして「*」(アスタリスク。0文字以上の文字に該当)を使うものとします。


 まずはAND条件の例です。次の画像では市町村名のうちかつ「『山』で始まり『市』以外で終わる」ものをXLOOKUP関数で検索して人口を取得しています。

 E3セル

=XLOOKUP(TRUE,COUNTIFS(B3:B8,B3:B8,B3:B8,"山*",B3:B8,"<>*市")>0,C3:C8)

 第2引数の中の「COUNTIFS(B3:B8,B3:B8,B3:B8,"山*",B3:B8,"<>*市")」がポイントです。「COUNTIFS(B3:B8,"山*",B3:B8,"<>*市")」でも済みそうですが、それだとB3:B8の範囲内で両方のワイルドカードに該当するものをカウントした1つの数値しか得られません。
 そこで「B3:B8,B3:B8」というダミー的な条件をおくことによりスピルが働き、各セルが条件に該当するかどうかを示すを6つの数値(該当すれば1、しなければ0。ただし重複する市町村がある場合は2以上にもなります)が得られます。
 この数値を「>0」でTRUE/FALSEに変換して、XLOOKUPの第1引数(検索値)をTRUEとすることで、両方の条件に該当する最初の値が検索されます。



 次はOR検索です。
 「田」を含むか、または「町」で終わる市町村を検索して人口の値を取得しています。

 E3セル

=XLOOKUP(TRUE,COUNTIFS(B3:B8,B3:B8,B3:B8,"*田*")+COUNTIFS(B3:B8,B3:B8,B3:B8,"*町")>0,C3:C8)

 2つのCOUNTIFS関数の足し算を行うことでOR条件としています。一方の条件に該当するセルは1に、両方の条件に該当するセルは2に変換されます(重複する市町村がある場合はさらに4とか6とかになります)。
 この数値を「>0」でTRUE/FALSEに変換し、XLOOKUPの第1引数(検索値)をTRUEとすることで、いずれか条件に該当する最初の値が検索されます。

クロス抽出(縦横方向の同時検索)をする方法

 縦横方向に検索を行い交点の値を求めるクロス抽出の方法についてです。
 次の画像内の表には縦横の2つの見出しがあり、店舗名と月の組み合わせで売上高を特定できるようになっています。
 そこでJ3セルにXLOOKUP関数を使った式を入力し、H3セルの店舗名とI3セルの月に対応する売上高を抽出しています。

 J3セル

=XLOOKUP(I3,C2:F2,XLOOKUP(H3,B3:B7,C3:F7))

 2つのXLOOKUP関数をネスト(入れ子)しています。
 まず内側のXLOOKUPで「C3:F7の範囲内の2行目」が抽出されます(B3:B7の範囲内で「池袋店」が2行目にあるから)。これにより「9440,10423,9031,12510」という4つの数値の配列が得られます。
 さらにこの結果に対してXLOOKUP関数を適用することにより4つの数値の中の3列目の「9031」が抽出されます(C2:F2の範囲内で「6月」が3列目にあるから)。
 文章にすると面倒な内容ですが、内側のXLOOKUPだけ実行してみればその先もわかりやすいと思います。

 なお次の記事では他の関数を使う方法を含めて、クロス抽出のやり方をいくつか紹介しています。

www.officeisyours.com

備考

 「*」や「+」演算子を使ったAND/OR条件の設定は見慣れないと奇妙に思えますが、FILTER関数でAND/OR抽出をする場合にも利用されます。
 また、SUM/IF関数やFILTER関数と組み合わせて条件付きのカウントや集計にも応用できます。特にOR条件において多重カウント(計上)の心配がなく条件を3つ以上に増やすのも簡単なので、スピルが導入されている現在ではCOUNTIF(S)やSUMIF(S)に頼るよりも圧倒的に有利です。
 これらについては次の記事で紹介しています。

(Excel)FILTER関数で複数条件(AND,OR)を指定する方法 - いきなり答える備忘録

(Excel)複数条件(OR条件)でカウントする方法 - いきなり答える備忘録

(Excel)複数条件(OR条件)で合計を求める方法 - いきなり答える備忘録