VLOOKUPで取れない「N番目の値」をExcelで取り出す6つの方法
「同じ顧客の2回目の購入履歴を確認したい」「特定の担当者が担当した3件目の案件を調べたい」——そんな場面でVLOOKUPを使うと、どうしても最初の1件しか返ってきません。
実務でこの壁にぶつかると、手作業でフィルタリングするか、データを目で追うしかなくなりがちです。非常に非効率ですよね。
この記事では、条件に合う「N番目」の値をExcelで取り出す方法を6つ、バージョン別・難易度別に整理して解説します。すべてコピペして使えるよう数式も完備しているので、読み終えたらすぐ業務に応用できます。
まず確認:どの方法を選べばいい?【早見表】
詳細を読む前に、自分の環境に合った方法を確認しておきましょう。
| 方法 | 対応バージョン | 複数列対応 | 複数N同時取得 | 難易度 |
|---|---|---|---|---|
| ① FILTER + INDEX | M365・Excel 2021 | △ | △ | ★☆☆ |
| ② FILTER + CHOOSEROWS | M365(新しいビルド) | △ | ✅ | ★☆☆ |
| ③ SMALL + IF + ROW | Excel 2010以降 | ❌ | △ | ★★★ |
| ③派生 MIN + IF + ROW | Excel 2010以降 | ❌ | ❌(1番目のみ) | ★★☆ |
| ④ 複数列対応(FILTER応用) | M365・Excel 2021 | ✅ | △ | ★★☆ |
| ⑤ N番目をセル参照で動的指定 | M365・Excel 2021 | △ | △ | ★☆☆ |
サンプルデータ
以下のデータを使って解説します。
| A列(担当者) | B列(売上) |
|---|---|
| 田中 | 100 |
| 鈴木 | 200 |
| 田中 | 300 |
| 佐藤 | 150 |
| 田中 | 500 |
| 鈴木 | 250 |
目標:「田中」の2番目の売上(300)を取り出す
基本編:N番目の値を1列から取り出す
方法①:FILTER + INDEX(Microsoft 365 / Excel 2021以降)
=IFERROR(INDEX(FILTER(B2:B7, A2:A7="田中"), 2), "該当なし")
解説:
FILTER(B2:B7, A2:A7="田中")→ 「田中」の売上だけを配列として取得{100; 300; 500}INDEX(..., 2)→ その配列の2番目(300)を返すIFERROR(..., "該当なし")→ 2番目が存在しない場合は「該当なし」と表示
⚠️ エラー処理は必須です。 N番目のデータが存在しない場合、
IFERRORなしでは#NUM!エラーが発生します。
✅ メリット: 可読性が高く、初めて見ても意味が理解しやすい
⚠️ 注意点: Excel 2019以前では使用不可
方法②:FILTER + CHOOSEROWS(複数のN番目を同時取得したいとき)
=IFERROR(CHOOSEROWS(FILTER(B2:B7, A2:A7="田中"), 2), "該当なし")
方法①とほぼ同じですが、CHOOSEROWSの真価は複数のN番目を一度に取得できる点です。
=CHOOSEROWS(FILTER(B2:B7, A2:A7="田中"), 1, 3)
これで「1番目(100)と3番目(500)」を同時に取り出せます。比較やレポート作成で非常に便利です。
✅ メリット: 複数のN番目を1つの数式で取得できる
⚠️ 注意点: Microsoft 365の比較的新しいビルドが必要
方法③:SMALL + IF + ROW(Excel 2010以降の旧来の定番)
Microsoft 365が使えない環境では、この組み合わせが定番です。
=IFERROR(INDEX(B:B, SMALL(IF(A2:A7="田中", ROW(A2:A7)), 2)), "該当なし")
※ Ctrl + Shift + Enter で配列数式として入力(Excel 2019以前)
解説:
ROW(A2:A7)→{2; 3; 4; 5; 6; 7}の行番号を生成IF(A2:A7="田中", ROW(A2:A7))→ 条件に合う行番号だけを残し、それ以外は論理値FALSEになる(SMALL関数はFALSEを無視して処理する)SMALL(..., 2)→ 2番目に小さい行番号(= 2番目に出現する「田中」の行)を取得INDEX(B:B, ...)→ その行番号のB列の値を返す
📌 補足: ステップ②の
FALSE部分は、表記上{2; FALSE; 4; FALSE; 6; FALSE}のように見えますが、これはあくまでイメージです。実際にSMALL関数が論理値FALSEをどう扱うかは省略表記であることをご承知おきください。
✅ メリット: Excel 2010以降のほぼ全バージョンで動作
⚠️ 注意点: 配列数式の入力方法に慣れが必要
方法③の派生:MIN + IF(1番目だけ取り出したい場合)
「1番目のみでよい」ケースなら、SMALLよりシンプルなMINで処理できます。
=IFERROR(INDEX(B:B, MIN(IF(A2:A7="田中", ROW(A2:A7)))), "該当なし")
N番目の取得が目的ではなく「最初の一致だけ」が目的なら、こちらを使いましょう。 方法③の軽量版と捉えてください。
応用編:より実務に近い使い方
応用①:複数列をまとめて取り出す(FILTER + INDEX)
「売上だけでなく、担当者名・売上・日付をまとめて取り出したい」場合:
=INDEX(FILTER(A2:C7, A2:A7="田中"), 2, 0)
INDEXの第3引数を0にすると、指定した行のすべての列が横方向に展開(スピル)されます。 たとえばこの数式をD2セルに入力すると、D2・E2・F2に「田中」の2番目のレコードが自動的に広がって表示されます。スクリーンショットのない環境では、あらかじめ右側の列を空けておくことを忘れずに。
応用②:N番目をセル参照で動的に切り替える
レポートやダッシュボードでは、「何番目を表示するか」をセルで指定できると便利です。
E1セルに 2 と入力した場合:
=IFERROR(INDEX(FILTER(B2:B7, A2:A7="田中"), E1), "該当なし")
E1の数値を変えるだけで、1番目・2番目・3番目…と動的に切り替わります。ドロップダウンリストと組み合わせれば、さらに操作しやすいUIになります。
【重要】エラー処理は必ず入れよう
N番目の一致を取り出す数式で実務上必ず遭遇するのが、「そのN番目が存在しないケース」 です。
たとえば田中のデータが2件しかないのに3番目を取り出そうとすると、#NUM!(SMALL系)や#VALUE!(FILTER系)が返されます。
=IFERROR(INDEX(FILTER(B2:B7, A2:A7="田中"), 3), "データなし")
このようにIFERRORで囲むだけで、エラーの代わりに任意のメッセージを表示できます。すべての数式にIFERRORをセットで使う習慣 をつけておきましょう。
まとめ:状況別の選び方
| 状況 | おすすめの方法 |
|---|---|
| Microsoft 365を使っている | FILTER + INDEX(方法①) |
| 複数のN番目を同時に取りたい | FILTER + CHOOSEROWS(方法②) |
| 古いExcelで動かす必要がある | SMALL + IF + ROW(方法③) |
| 最初の1件だけでいい | MIN + IF + ROW(方法③派生) |
| 複数列まとめて取り出したい | FILTER + INDEX(応用①) |
| N番目をセルで切り替えたい | セル参照を使った動的指定(応用②) |
VLOOKUPの「1件目しか返せない」という壁は、今回紹介した方法で確実に突破できます。まずは自分のExcelバージョンに合った方法を1つコピペして試してみてください。数式の動作が確認できたら、IFERRORを加えて実務データに応用するのがおすすめの進め方です。
このブログでは、Excelのルックアップ系関数を実務目線で体系的に解説しています。他の記事もあわせてご覧ください。