「最後に一致する値」をExcelで取得する5つの方法
VLOOKUPで同じキーが複数行あるデータを検索したとき、「なぜか古い価格が返ってくる…」と困った経験はないでしょうか。VLOOKUPは上から最初に一致した値しか返せないため、最新データを取りたい場面では使えません。
たとえば、商品の最新価格を確認したい、社員の直近の勤怠ステータスを調べたいといった場面です。こうした「最後に一致する値(Last Match)」の取得は、正しい関数と引数を知っているだけで数秒で解決できます。本記事では、Microsoft 365向けのシンプルな方法から、Excel 2016以前でも動く互換性重視のテクニックまで、実務で即使える5つの方法を紹介します。
サンプルデータ
以下のデータを例に使います。「A001」の最後に一致する価格 180 を取得することが目標です。
| A列(商品コード) | B列(価格) |
|---|---|
| A001 | 100 |
| A002 | 200 |
| A001 | 150 |
| A003 | 300 |
| A001 | 180 |
方法1:XLOOKUP(逆順検索)─ 最もシンプル
対応バージョン:Microsoft 365 / Excel 2021
=XLOOKUP("A001", A:A, B:B, "なし", 0, -1)
XLOOKUPの第6引数に -1 を指定するだけで、末尾から逆順に検索します。結果は 180 が返ります。
| 引数 | 値 | 意味 |
|---|---|---|
| 第4引数 | "なし" |
見つからない場合の表示 |
| 第5引数 | 0 |
完全一致 |
| 第6引数 | -1 |
末尾から検索 |
応用:別の列の値を返したいとき
C列(日付)など別の列の値が欲しい場合は、返す列を変えるだけです。
=XLOOKUP("A001", A:A, C:C, "なし", 0, -1)
この柔軟性がXLOOKUPの最大の強みです。Microsoft 365を使っているなら、まずこれを覚えておけば十分です。
方法2:XMATCH + INDEX(取得列を柔軟に変えたいとき)
対応バージョン:Microsoft 365 / Excel 2021
=INDEX(B:B, XMATCH("A001", A:A, 0, -1))
XMATCHで最後に一致する行番号を取得し、INDEXでその行の値を返します。結果は 180 です。
XMATCHの第3引数0:完全一致XMATCHの第4引数-1:末尾から検索
XLOOKUPとほぼ同じ用途ですが、INDEXと組み合わせることで複数列を同時に参照するような複雑な数式に組み込みやすいメリットがあります。
方法3:FILTER + TAKE(複数件取得にも応用できる)
対応バージョン:Microsoft 365のみ(TAKE関数はExcel 2021では使用不可)
=TAKE(FILTER(B:B, A:A="A001"), -1)
FILTERで「A001」に一致するすべての価格(100, 150, 180)を抽出し、TAKEの第2引数 -1 で末尾の1件だけを取り出します。結果は 180 です。
⚠️
TAKE関数はMicrosoft 365専用です。Excel 2021では使えません。まとめ表の「365/2021」という表記に誤りがあるため、この点に注意してください。
この方法の強みは「最後の3件を取得したい」など、複数件取得への応用が効くことです。
=TAKE(FILTER(B:B, A:A="A001"), -3) ' 最後の3件を取得
方法4:LOOKUP(古典的トリック)─ 全バージョン対応
対応バージョン:全バージョン(Excel 2016以前も可)
=LOOKUP(2, 1/(A2:A10="A001"), B2:B10)
一見不思議な式ですが、仕組みを理解すると納得できます。結果は 180 です。
仕組みの解説
A2:A10="A001"→ 一致する行はTRUE(=1)、不一致はFALSE(=0)の配列になる1/配列→ 一致箇所は1、不一致箇所は1/0で#DIV/0!エラーになるLOOKUP(2, ...)→ 2は配列中に存在しないため、最後の数値(最後の1)の位置が使われる- 結果として最後に一致した行のB列の値が返る
LOOKUPは近似一致で配列を昇順にスキャンし、超えない最大値を返す性質を逆手に取ったテクニックです。
⚠️ 範囲は必ず
A2:A10のように実データの範囲を指定してください。列全体(A:A)を指定するとパフォーマンスが大幅に低下します。
方法5:INDEX + MAX(IF) ─ 配列数式による古典的手法
対応バージョン:全バージョン(Excel 2016以前も可)
{=INDEX(B2:B10, MAX(IF(A2:A10="A001", ROW(A2:A10)-ROW(A2)+1)))}
Ctrl+Shift+Enter で確定する配列数式です(Microsoft 365では通常のEnterでも動作する場合があります)。結果は 180 です。
仕組みの解説
IF(A2:A10="A001", ROW(A2:A10)-ROW(A2)+1)→ 一致する行の相対行番号(1〜9)を返す。不一致はFALSEMAX(...)→ 相対行番号の最大値=最後に一致した行番号 を返すINDEX(B2:B10, ...)→ その行のB列の値を返す
可読性は低めですが、どのバージョンのExcelでも確実に動くため、古いExcelが混在する職場環境では今でも重宝するパターンです。
まとめ:自分に合った方法の選び方
| 方法 | 対応バージョン | 難易度 | 特徴 |
|---|---|---|---|
| XLOOKUP(-1) | 365 / 2021 | ★☆☆ | 最もシンプル。まずこれ |
| XMATCH + INDEX | 365 / 2021 | ★★☆ | 複雑な数式への組み込みに強い |
| FILTER + TAKE | 365のみ | ★★☆ | 複数件取得にも応用可 |
| LOOKUP トリック | 全バージョン | ★★★ | 互換性重視の現場向け |
| INDEX + MAX(IF) | 全バージョン | ★★★ | 古典的な配列数式 |
迷ったらこのフローで選んでください。
Microsoft 365を使っている?
→ YES:XLOOKUP(-1)を使う(方法1)
→ NO:Excel 2019 / 2021?
→ YES:XMATCH + INDEXを使う(方法2)
→ NO(2016以前):LOOKUPトリックを使う(方法4)
「最後に一致する値」の取得は、一度正しい方法を覚えてしまえば数式1行で解決できる問題です。まず自分のExcelバージョンを確認し、対応する方法を1つマスターするところから始めてみてください。