いきなり答える備忘録

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

(Excel)XLOOKUP関数で検索範囲に複数列を指定する

 ExcelのXLOOKUP関数で、検索値が複数列の値のいずれかに該当する場合に対応する値を返す方法を紹介します。

  • +演算子を併用することで、XLOOKUP関数の検索範囲に複数列を指定した結果を得ることができます。
  • COUNTIF関数等を併用する方法もあります。検索範囲の列が多くても式が長くなりません。

+演算子を使用する方法

 次の画像では、F3セルに入力されている検索キー(井上)をB列、C列の両方から検索して、対応する担当地区の値を得ています。

 G3セル

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

 「(B3:B6=F3)+(C3:C6=F3)>0」の部分により、データの4つの行がそれぞれFALSE(「井上」を含まない行)またはTRUE(「井上」を含む行)の数値に変換されます。
 これをXLOOKUP関数の第2引数(検索範囲)とし、さらに第1引数(検索値)を「TRUE」とすることで、「井上」を含む行の担当地区の値が得られます。ややトリッキーですが、要は複数条件(OR条件)による検索の一種です。



 ちなみに「(B3:B6=F3)+(C3:C6=F3)>0」の部分だけ実行すると次のようになります。3行目が「TRUE」になっており、あとは上記の式ようにXLOOKUP関数を重ねれば「C地区」が返されるのがわかると思います。



 注意点として、データがこのような形式になっている場合に「空白セル」にマッチする値を取得してしまうことが起こりやすい、という点が挙げられます。
 画像では「B地区」を担当する担当者が1人しかおらずC3セルが空白セルになっており、さらにF3セルが空白セルであるため結果的に「B地区」が取得されています。
 これは意図しない検索結果といえます。



 そこで次の画像では、検索キーが空白なら何も値を返さない、という式にしています。

 G3セル

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

 ただし以降ではこのような(検索キーが空白の場合の)対応については省略します。



 また、この方法の弱点は、検索キーが複数ある場合にスピルで対応しにくいことです。
 そこで次の画像では、絶対参照と式のコピーを使って3つの検索キー(担当者)に対応する検索結果(担当地区)を得ています。

 G3セル(下方にコピー)

=XLOOKUP(TRUE,(B$3:B$6=F3)+(C$3:C$6=F3)>0,D$3:D$6)

COUNTIF/BYROW/LAMBDA関数を併用する方法

 上記の例では検索範囲が2列だったのでまだ式が短く済んでいますが、5列とか10列に増えた場合には長くなり入力が面倒です。
 そこで次の画像では複数列を一括して検索できるようにしています。

 I3セル

=XLOOKUP(TRUE,BYROW(B3:E6,LAMBDA(a,COUNTIF(a,H3)))>0,F3:F6)

 BYROW/LAMBDA関数を使って検索範囲であるB3:E6の範囲にaと名付け、その1行ごとにCOUNTIF関数を実行しています。これにより各行に検索キー(クマ)が含まれているかそれぞれ判定しています(具体的には最初の例の2番目の画像と同様にFALSE,FALSE,TRUE,FALSEの4つの値が得られます)。これをXLOOKUP関数の第2引数(検索範囲)とすることで「TRUE」に対応する行の値である「哺乳類」を取得しています。



 ただしこの方法も、検索キーのスピルに対応できないのが弱点です。
 そこで次の画像では、絶対参照と式のコピーを使用して、3つの検索キー(名称)に対応する分類を取得しています。

 I3セル(下方にコピー)

=XLOOKUP(TRUE,BYROW(B$3:E$6,LAMBDA(a,COUNTIF(a,H3)))>0,F$3:F$6)

備考

 記事初出時は「=XLOOKUP(1,(B3:B6=F3)+(C3:C6=F3),D3:D6)」のような式を使用していましたが、検索キーが1つの行で2つ以上みつかる場合に対応できない(そんなデータはあまりないと思いますが)等の理由により改めました。