doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

VLOOKUPで取れない「N番目の値」をExcelで取り出す6つの方法【バージョン別に選べるコピペ対応】

スポンサーリンク


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), "該当なし")

解説:

  1. FILTER(B2:B7, A2:A7="田中") → 「田中」の売上だけを配列として取得 {100; 300; 500}
  2. INDEX(..., 2) → その配列の2番目(300)を返す
  3. 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以前)

解説:

  1. ROW(A2:A7){2; 3; 4; 5; 6; 7} の行番号を生成
  2. IF(A2:A7="田中", ROW(A2:A7)) → 条件に合う行番号だけを残し、それ以外は論理値FALSEになる(SMALL関数はFALSEを無視して処理する)
  3. SMALL(..., 2) → 2番目に小さい行番号(= 2番目に出現する「田中」の行)を取得
  4. 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のルックアップ系関数を実務目線で体系的に解説しています。他の記事もあわせてご覧ください。