Excel関数 逆引き集 | 上方向検索 → XLOOKUP

Excel VBA Excel
スポンサーリンク

概要

「下方向じゃなくて“上に向かって”検索したい」「同じコードが何回も出てきていて、“最後じゃなくて一番上のデータ”を取りたい」――そんなときに力を発揮するのが、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件だけ」を抜き出す仕事がとても楽になります。

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