概要
「下方向じゃなくて“上に向かって”検索したい」「同じコードが何回も出てきていて、“最後じゃなくて一番上のデータ”を取りたい」――そんなときに力を発揮するのが、XLOOKUP の「検索モード」です。
XLOOKUP は、検索範囲を上からだけでなく「下から上へ」や「上から下へ」といった向きまで指定できます。
ここでは、「上方向検索」にフォーカスして、書き方と実務での使いどころを、初心者向けにかみ砕いて解説します。
基本の考え方
XLOOKUP の基本形は、次のとおりです。
=XLOOKUP(検索値, 検索範囲, 戻り範囲, [見つからない場合], [一致モード], [検索モード])
上方向検索でポイントになるのは、最後の引数「検索モード」です。
検索モードには次のような指定ができます。
0(省略)… 上から下へ検索(標準)
1 … 上から下へ検索(昇順前提のバイナリ検索)
-1 … 下から上へ検索(降順前提のバイナリ検索)
2 … 上から下へ「全件スキャン」
-2 … 下から上へ「全件スキャン」
「上方向検索」でよく使うのは、
「一番下から上へ向かって探す」= -1 または -2 です。
特に、同じコードが複数行ある履歴表などで「最新側」「過去側」を取り分けるときに威力を発揮します。
基本の使い方(上から/下からどちらを拾うか)
上から最初に見つかったものを取る(標準)
これは検索モードを省略した、普通の XLOOKUP です。
=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100)
上から順に見ていき、最初に一致した行の値を戻り範囲から返します。
下から最初に見つかったものを取る(上方向検索)
履歴のように、同じIDが何回も出てくる表で「一番下側(最新)」を取りたいときは、下から上へ検索します。
=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "なし", 0, -1)
最後の「-1」が「下から上に向かって探す」という指定です。
上からではなく、いちばん下に近い一致を取りたいときのパターンとして覚えてください。
上方向検索の具体例
最新の取引を取得するイメージ
A列に「顧客ID」、B列に「取引日」、C列に「金額」が履歴としてズラっと並んでいるとします。
顧客IDごとに「一番新しい取引金額(下にある方)」を取りたいときは、次のように書けます。
顧客IDを E2 に入れて、最新金額を F2 に出したい場合:
=XLOOKUP(E2, $A$2:$A$100, $C$2:$C$100, "取引なし", 0, -1)
A列を「下から上」に探して最初に見つかった行の C列(最新の金額)を返します。
最新日付を取る場合
同じ形で、金額ではなく日付を返すこともできます。
=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "取引なし", 0, -1)
応用テンプレート(実務で使える型)
入力が空欄なら何も表示しない+上方向検索
顧客IDが空欄のときは計算させず、入力されたときだけ「最新取引金額」を出したいパターンです。
=IF(E2="","",XLOOKUP(E2,$A$2:$A$100,$C$2:$C$100,"取引なし",0,-1))
E2が空なら空文字、それ以外は「下から上へ検索」。
上方向検索で「過去側」を取るのではなく「いちばん古い方」を取りたい場合
この場合は「上から下」が正解なので、あえて通常の検索モード(省略 or 0)を使います。
=XLOOKUP(E2, $A$2:$A$100, $C$2:$C$100, "取引なし")
上方向検索は「最新側(末尾側)」を取りたいときの武器、と覚えておくと混乱しません。
日付つき履歴で「最新行の全項目」を返したい(INDEX+XMATCH)
XLOOKUP だけでなく、行番号を取ってから INDEX でまとめて返す方法もあります。
(少し上級ですが、イメージだけ)
=LET(
pos, XMATCH(E2, $A$2:$A$100, 0, -1),
INDEX($A$2:$D$100, pos, {1,2,3,4})
)
XMATCH でも「-1」で下から上へ検索できます。
よくあるつまずきと対策
検索範囲と戻り範囲は「同じ行数」にそろえる
XLOOKUP は、検索範囲と戻り範囲のサイズが違うとエラーになります。
上方向検索でもここは変わりません。
検索範囲:$A$2:$A$100
戻り範囲:$C$2:$C$100
のように、必ず「同じ行数・同じ開始行」にそろえてください。
検索モードを間違えると「思っていた値」が出ない
0 や省略は「上から下」、-1 は「下から上」です。
「最新データが欲しいのに、最初のデータが返ってきている…」というときは、検索モードが 0 のままになっていないか確認してください。
完全一致が標準なので安心
VLOOKUP と違い、XLOOKUP は完全一致がデフォルトです。
一致モードを省略しても、基本的には安全に使えます(ただし近似が必要なときは別)。
型(文字列/数値)の違いで見つからないことがある
上方向検索だからといって、この問題は変わりません。
顧客IDなどが「数値と文字列で混ざっている」場合は、TEXT や VALUE で揃えましょう。
例題
問題1: A2:A100 に顧客ID、C2:C100 に金額の履歴があります。E2 の顧客IDに対して「一番下にある(金額の)最新データ」を F2 に表示してください。
= XLOOKUP(E2, $A$2:$A$100, $C$2:$C$100, "取引なし", 0, -1)
問題2: A2:A100 に顧客ID、B2:B100 に取引日があります。E2 の顧客IDの「最新取引日」を F2 に表示してください。
= XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "取引なし", 0, -1)
問題3: 問題1の式について、E2 が空欄のときは空のまま、入力されているときだけ最新金額を表示するように G2 に式を書いてください。
= IF(E2="","", XLOOKUP(E2, $A$2:$A$100, $C$2:$C$100, "取引なし", 0, -1))
問題4: A2:A100 に顧客ID、C2:C100 に金額があります。E2 の顧客IDに対して「一番上にある(最初の)金額」を F2 に表示する式を書いてください(あえて上から検索)。
= XLOOKUP(E2, $A$2:$A$100, $C$2:$C$100, "取引なし")
問題5: A2:A100 に顧客ID、B2:B100 に取引日、C2:C100 に金額があります。E2 の顧客IDに対し、「最新取引日(下から検索)に対応する金額」を G2 に表示してください。
ヒント:最新取引日を下から検索し、その行の金額を返すイメージです。
= XLOOKUP(E2, $A$2:$A$100, $C$2:$C$100, "取引なし", 0, -1)
(A列の「最新行」をそのまま C列に適用しているイメージです)
まとめ
XLOOKUP の「検索モード」を使うと、
「上から探すか」「下から探すか」までコントロールできるようになります。
上方向検索の肝は、
検索モードに -1(または -2)を指定して「下から上へ」
検索範囲と戻り範囲のサイズをそろえる
最新データを取りたいときは「下から検索」が有効
この3つです。
一度“下から検索”の感覚がつかめると、履歴表・ログ・取引明細から「最新の1件だけ」を抜き出す仕事がとても楽になります。
