いきなり答える備忘録

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

(Excel)XLOOKUP関数で2番目(n番目)に該当するものを抽出する

 ExcelのXLOOKUP関数で、検索値が複数該当(検索範囲内に複数存在する)場合に2番目(あるいは任意のn番目)に該当するものを探し、対応する値を抽出する例についてです。
 ただし「無理やりXLOOKUPを使った」という感じで、実用的にはFILTER関数を使うべき内容です。

手順

 次の画像では、左側の表のB列からE3セルの値(神奈川県)を検索し、その2番目のものに対応する市町名(海老名市)を取得しています。

 F3セル

=XLOOKUP(SMALL(IF(B3:B9=E3,ROW(B3:B9),""),2),ROW(B3:B9),C3:C9)

 ちょっと複雑ですが、IF関数を使ってB列の値がE3セルの値と一致したらその行番号に、一致しなかったら空文字列に変換しています。そしてSMALL関数を使い行番号のうち2番目に小さいものを求めてXLOOKUP関数の検索値としています。一方で検索範囲としてB列の行番号「ROW(B3:B9)」を指定しています。これにより値が一致するセルのうち2番目のものの位置を特定でき、対応するC列の値を抽出できるというわけです。



 IF関数の部分だけ実行すると次のようになります。
 さらにSMALL関数を使って「SMALL(IF(B3:B9=E3,ROW(B3:B9),""),2)」とすることで「5」が取得できることがわかります。
 行番号を使うアプローチなので「=INDIRECT("C"&SMALL~)」とする方が簡単に値を取得できてしまうのですが、列挿入/削除時のメンテや複数列取得に関してはXLOOKUPの方に分があります。



 次の画像ではF3セルに入力された数値nをもとに、該当するn番目の値を取得するようにしています。
 式は上記式中の「2」をセル参照「F3」に変えただけです。

 G3セル

=XLOOKUP(SMALL(IF(B3:B9=E3,ROW(B3:B9),""),F3),ROW(B3:B9),C3:C9)

 


 F3の値を「3」に変えると神奈川県の3番目あたる「川崎市」が抽出されます。
 なお存在しない番号(0以下のほか、この例の場合は5以上)を指定すると#NUM!エラーになります。SMALL関数により生じているエラーなのでXLOOKUPの第4引数では代替値を指定できません。このほかワイルドカードが使えないなどXLOOKUP関数としての機能が制約されてしまうのが痛いところです。



 SMALL関数をLARGE関数に変えると「下からn番目」の検索になります。
 画像では下から2番目を抽出していますので、上から3番目の場合と同じ「川崎市」が抽出されています。

 F3セル

=XLOOKUP(LARGE(IF(B3:B9=E3,ROW(B3:B9),""),F3),ROW(B3:B9),C3:C9)

備考

 繰り返しになりますがFILTER関数を使った方がはるかに簡単で実用的です。
 例としてFILTER関数を使って最初の画像と同じことをやると次のようになります。

 F3セル

=INDEX(FILTER(C3:C9,B3:B9=E3),2)

 ただしINDEX関数だと下からn番目の取得ができないので、必要であればCHOOSEROWS関数を使うのが適当です。