いきなり答える備忘録

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

(Gスプレッドシート)XLOOKUP関数で複数条件(AND,OR)を指定する

 GoogleスプレッドシートのXLOOKUP関数でAND条件(かつ)やOR条件(または)を指定して値を抽出する方法についてです。

  • XLOOKUP関数の第2引数(検索範囲)に複数の列を「&」でつないだものを指定することで、複数の列に条件を課すAND検索を行うことができます。
  • 「*」や「+」を使った論理演算を用いることで任意のAND/OR条件を指定できます。
  • ただしFILTER関数の方が使い勝手がいいかもしれません。

AND条件(かつ)の場合

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

 H3セル

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

 第1引数(検索値)として「F3&G3」と、建物名と部屋番号の2つの値を連結した値を指定しています。第2引数(検索範囲)は「ARRAYFORMULA(B3:B8&C3:C8)」として、2つの列を連結したものを指定します。これで建物名と部屋番号がF3,G3セルの値とともに一致する入居者を抽出できるというわけです。
 ARRAYFORMULAがないとXLOOKUPの第2引数として1つの値(B3&C3)しか生成できないためエラーになるのが注意点です。



 次はもう1つの方法です。
 H3セルに別の式を入力して、上記の画像と全く同じ結果を得ています。

 H3セル

=XLOOKUP(1,ARRAYFORMULA((B3:B8=F3)*(C3:C8=G3)),D3:D8)

 第2引数「ARRAYFORMULA(~)」の部分で「*」演算子を使って各行が両方の条件を満たすかどうかの判定を行っています。両方の条件に該当する行を「1」、そうでない行を「0」に変換した配列を作り、そこから「1」を検索して対応する入居者の氏名を抽出しています。
 検索値も含めて条件のすべてを第2引数内に記述するという一見奇妙な式ですが機能的には優秀で、大小比較などあらゆる条件を指定できる(関数を組み合わせることもできます)という点も強力です。ただ、後述のFILTER関数を使った方がむしろわかりやすい感じなのが痛いところではあります。

OR条件(または)の場合

 次の画像のデータは上記の例と同じですが、式を少し変えることにより、指定した建物名と部屋番号のうちどちらかを満たすもの(の中で最も上にあるもの)を抽出しています。

 セル

=XLOOKUP(1,ARRAYFORMULA(SIGN((B3:B8=F3)+(C3:C8=G3))),D3:D8)

 第2引数「ARRAYFORMULA(~)」の部分で「+」演算子を使って各行がいずれかの条件を満たすかどうかの判定を行っています。両方の条件に該当する行を「2」に、一方のみの条件を満たす行を「1」に、いずれも満たさない行を「0」に置き換えた配列が作成されます。このようにOR条件の場合は2以上の値ができることがあるので1以上はすべてSIGN関数で「1」に置き換え、そこから「1」を検索して該当する位置にある入居者の氏名を抽出しています。

クロス抽出について

 AND条件の一種であるクロス抽出についてです。
 次の画像内の表には縦横の2つの見出しがあり、店名と月の組み合わせから売上高を特定できます。
 そこでJ3セルにXLOOKUP関数を使った式を入力し、H3セルの店舗名とI3セルの月に対応する売上高を抽出しています。

 J3セル

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

 XLOOKUP関数をネスト(入れ子)しています。
 まず内側の「XLOOKUP(H3,B3:B7,C3:F7)」により、「C3:F7の範囲の中の上から4行目」が抽出されます。つまり「20125,20694,21055,25118」という4つの数値の配列が得られます。これはB3:B7の見出しの中での「大阪支店」の位置が4行目だからです。
 さらにこの結果に対して外側のXLOOKUP関数を適用することにより、4つの数値のうち2列目(2番目)の値が抽出されます。これはC2:F2の見出しの中での「5月」の位置が2列目だからです。
 4つの数値のうち2列目(2番目)の値は「20694」ですので、最終的にこの値が抽出されます。

 クロス抽出については他にいくつかの方法があります。XLOOKUP関数の例を含め代表的なものを次の記事で紹介しています。

www.officeisyours.com

備考

FILTER関数を使用した場合

 本記事ではあくまでXOOKUP関数にこだわってみましたが、上記の抽出内容はFILTERで代用することが可能です。
 クロス抽出についてはXLOOKUPの方が扱いやすいもののAND条件の例とOR条件の例で示した内容についてはFILTERの方が簡潔にまとまりますので以下に示します。
 まずはAND条件です。

 H3セル

=INDEX(FILTER(D3:D8,(B3:B8=F3)*(C3:C8=G3)),1)

 FILTER関数で両方の条件を満たす行に対応する入居者を抽出し、さらに複数該当する場合はINDEX関数で最も上にあるものを抽出(XLOOKUPの機能を再現)しています。FILTER関数を用いる特典としてARRAYFORMULAが要らないため式が短くなります。



 次にOR条件です。

 H3セル

=INDEX(FILTER(D3:D8,(B3:B8=F3)+(C3:C8=G3)),1)

 上記の式の「*」を「+」に置き換えただけです。FILTER関数では0以外の数値がTRUEとみなされるためSIGN関数で「1」に変換するような処理が要らず、これも簡潔にまとまります。