Excel関数 逆引き集 | n番目に一致した値 → SMALL+FILTER

Excel VBA Excel
スポンサーリンク

概要

「一致する値が複数あるとき、n番目の一致だけ取りたい
こういう場面は、名簿・売上履歴・ログデータなどでよくあります。

Microsoft 365 なら、FILTER で一致する行を全部取り出し、SMALL で n番目を指定するという方法が最もシンプルで強力です。

  • FILTER → 条件に合う値を“全部”抽出
  • SMALL → 抽出された値の中から「n番目に小さい値」を返す

この組み合わせで「n番目の一致」を簡単に取得できます。


基本の考え方

1. FILTER で一致する値をすべて抽出

例:A2:A100 の中から「F2 と一致する値」だけを取り出す

=FILTER(A2:A100, A2:A100=F2)

これで「一致した値の一覧」が返ってきます。

2. SMALL で n番目を指定

FILTER の結果は配列なので、SMALL で n番目を取り出せます。

=SMALL(FILTER(A2:A100, A2:A100=F2), n)

n に 1 を入れれば「1番目の一致」、
n に 2 を入れれば「2番目の一致」になります。


具体例(数値の n番目一致)

A列に売上金額、F2 に検索したい金額、G2 に n(順位)が入っている場合

=SMALL(FILTER($A$2:$A$100, $A$2:$A$100=$F$2), G2)
  • FILTER が「一致した売上金額の一覧」を返す
  • SMALL がその中から「G2 番目に小さい値」を返す
    → 結果として「n番目の一致値」が取得できる

文字列の n番目一致を取りたい場合

文字列は SMALL では扱えないため、行番号を使う方法が定番です。

行番号を使った n番目一致(文字列対応)

=INDEX($A$2:$A$100,
       SMALL(FILTER(ROW($A$2:$A$100)-ROW($A$2)+1, $A$2:$A$100=F2), G2))

ポイントをかみ砕くと:

  • ROW($A$2:$A$100)-ROW($A$2)+1
    → A2:A100 を「1,2,3,…」という連番に変換
  • FILTER で「一致した行番号だけ」を抽出
  • SMALL で「n番目の行番号」を取得
  • INDEX でその行の値を返す

これで文字列でも「n番目の一致」が取れます。


応用テンプレート

n番目の一致する“行番号”を返す

=SMALL(FILTER(ROW(A2:A100), A2:A100=F2), G2)

n番目の一致する“行全体”を返す(複数列)

A2:D100 の中で「商品名(C列)が F2 と一致する n番目の行」を返す:

=INDEX($A$2:$D$100,
       SMALL(FILTER(ROW($A$2:$A$100)-ROW($A$2)+1, $C$2:$C$100=F2), G2),
       SEQUENCE(1,4))
  • SEQUENCE(1,4) → 4列分をまとめて返す
  • FILTER+SMALL → n番目の行番号を取得

よくあるつまずきと対策

一致が n件未満だとエラーになる

例:一致が2件しかないのに、n=3 を指定すると #NUM! になります。
ユーザーに優しくするなら IFERROR を使います。

=IFERROR(
   SMALL(FILTER(A2:A100, A2:A100=F2), G2),
   "該当なし"
)

FILTER の範囲と条件範囲は必ず同じ行数にする

例:A2:A100 を抽出するなら、条件も A2:A100 で揃えること。
ずれると配列エラーになります。

文字列は SMALL で扱えない

文字列の n番目一致は必ず「行番号を SMALL で取る → INDEX で値を返す」という流れになります。


例題

問題1: A2:A100 に売上金額があります。F2 の金額と一致する値のうち「1番目の一致」を G2 に表示してください。

=SMALL(FILTER(A2:A100, A2:A100=F2), 1)

問題2: A2:A100 に売上金額、F2 に金額、G2 に n が入っています。n番目の一致値を H2 に表示してください。

=SMALL(FILTER(A2:A100, A2:A100=F2), G2)

問題3: A2:A100 に商品名(文字列)が入っています。F2 の商品名と一致する「n番目の一致」を G2 に表示してください。

=INDEX($A$2:$A$100,
       SMALL(FILTER(ROW($A$2:$A$100)-ROW($A$2)+1, $A$2:$A$100=F2), G2))

問題4: C列の商品名が F2 と一致する「n番目の行番号」を H2 に表示してください。

=SMALL(FILTER(ROW(C2:C100), C2:C100=F2), G2)

問題5: A2:D100 の表から、「商品名(C列)が F2 と一致する n番目の行全体」を I2 に表示してください。

=INDEX($A$2:$D$100,
       SMALL(FILTER(ROW($A$2:$A$100)-ROW($A$2)+1, $C$2:$C$100=F2), G2),
       SEQUENCE(1,4))

まとめ

n番目の一致を取るときの基本パターンは次の2つです。

数値の n番目一致

=SMALL(FILTER(範囲, 条件), n)

文字列の n番目一致

=INDEX(範囲, SMALL(FILTER(行番号配列, 条件), n))

この2つを覚えておけば、
「n番目の売上」「n番目の一致する商品」「n番目の該当行」など、
実務でよくある“複数一致の中から順位を取る”処理がすべて書けるようになります。

タイトルとURLをコピーしました