ただし「無理やり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関数を使うのが適当です。