Excel関数 逆引き集 | 最初に一致した値 → XLOOKUP

Excel VBA Excel
スポンサーリンク

概要

「同じコードやIDが何回も出てくるけど、とりあえず“最初に見つかった1件”だけ取れればいい」
こういう場面で一番シンプルに使えるのが XLOOKUP です。

XLOOKUP は、検索範囲を上から(左から)順に見ていき、
条件に合う「最初の一致」を返すのが基本動作です。
VLOOKUP より柔軟で、左方向・右方向・上下どこでも検索できるうえ、
「見つからないときの値」も1つの関数で指定できます。


XLOOKUP の基本の書式

基本形

=XLOOKUP(検索値, 検索範囲, 戻り範囲, [見つからない場合], [一致モード], [検索モード])

よく使うのは前半の3〜4つです。

検索値:探したい値(商品コード・社員番号・顧客IDなど)
検索範囲:その値が並んでいる列(または行)
戻り範囲:見つかったときに返してほしい列(または行)
見つからない場合:該当がないときに返すメッセージ(省略可)

「最初に一致した値」を取りたいだけなら、
一致モードや検索モードは省略して構いません(標準が「完全一致+上から検索」になっているためです)。


最初に一致した値を取得する基本パターン

商品コードから商品名(最初の一致)を取る

商品マスタが次のようになっているとします。

A列:商品コード
B列:商品名

注文シート側で、E2 に商品コードを入力し、F2 に商品名を表示したい場合:

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100)

これはこう読めます。
「E2 の値を、A2:A100 の中から探して、最初に一致した行の B2:B100 の値を返す」

同じ商品コードが複数行あっても、
A2 から下へ順番に見て、最初に合った1行だけが返されます。

左方向検索でも“最初の一致”を簡単に

A列:商品名
B列:商品コード

のように、コードが右側にあっても大丈夫です。
E2 の商品コードから商品名(左側)を取りたい場合:

=XLOOKUP(E2, $B$2:$B$100, $A$2:$A$100)

検索範囲(B列)を上から順に見て、最初に一致した行の A列を返します。
「左方向でも最初の一致」が1行で書けるのが、XLOOKUP の強みです。


見つからない場合の値指定と空欄対策

見つからないときにメッセージを出す

「#N/A エラーを見せたくない」というときは、第4引数を使います。

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "未登録")

検索値が見つからない場合は、「未登録」と表示されます。

入力が空欄のときは何も表示しない

検索値セル(ここでは E2)が空のときまで XLOOKUP を走らせると、
「未登録」がズラっと並んで見づらくなります。
そんなときは IF と組み合わせるのが定番です。

=IF(E2="","",
    XLOOKUP(E2,$A$2:$A$100,$B$2:$B$100,"未登録"))

E2 が空なら空文字(何も表示しない)、
入力されているときだけ XLOOKUP を実行する流れです。


応用(検索方向と“最初の一致”の関係)

縦方向で「上から最初の一致」を取る(標準)

基本形の XLOOKUP は、検索範囲を「上から下」に見ていきます。
検索モードを指定しなければ、常に「最初に一致した値」が返ります。

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100)  ' 上から最初の一致

同じIDが複数ある履歴表で「一番古い記録(最初の一致)」を取りたいときにも使えます。

下から最初の一致(=最新)を取りたい場合との違い

「最初の一致」ではなく、「一番下の一致(最新)」を取りたい場合は、検索モードを -1 にします。

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "なし", 0, -1)

ここで説明しているのは、検索モードを指定しない通常の XLOOKUP なので、
「特に何も指定しなければ、“上から順に見て最初に一致した値”が返る」と整理しておいてください。


よくあるつまずきと対策

検索範囲と戻り範囲の行数を必ず揃える

検索範囲:$A$2:$A$100
戻り範囲:$B$2:$B$100

のように、開始行と終了行を揃える必要があります。
片方だけ A3:A100 などにずれるとエラーや意図しない結果になります。

完全一致が標準なので FALSE は不要

VLOOKUP では「FALSE を忘れて近似一致になった」問題がよく起きますが、
XLOOKUP は第5引数([一致モード])を省略すると「完全一致」が標準です。

普通に書くだけで「完全一致+最初の一致」が取れるので、
マスタ参照の安全性が高くなります。

同じ値が複数行ある場合は「一番上の1件だけ」

XLOOKUP(標準設定)で検索すると、
条件に合う行が何件あっても、「一番上の1件だけ」が返ります。
「2件目・3件目も欲しい」「全部の件数を一覧にしたい」という場合は、
FILTER や SMALL+FILTER など別のテクニックが必要になります。


例題

問題1: A2:A100 に商品コード、B2:B100 に商品名があります。E2 の商品コードに対して、最初に一致した商品の商品名を F2 に表示してください。

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100)

問題2: 問題1の設定で、E2 の商品コードが見つからない場合は「未登録」と表示する式を G2 に書いてください。

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "未登録")

問題3: A2:A100 に商品名、B2:B100 に商品コードがあります。E2 に商品コードを入力し、そのコードに最初に一致した商品名(左方向)を F2 に表示する式を書いてください。

=XLOOKUP(E2, $B$2:$B$100, $A$2:$A$100, "未登録")

問題4: 問題1のシートで、E2 が空欄のときは何も表示せず、入力されているときだけ「最初に一致した商品名」を表示する式を H2 に書いてください。

=IF(E2="","",
    XLOOKUP(E2,$A$2:$A$100,$B$2:$B$100,"未登録"))

問題5: A2:A100 に顧客ID、B2:B100 に取引日があり、同じ顧客IDが複数行存在します。E2 の顧客IDについて、「最初に一致した取引日(=一番古い取引)」を F2 に表示する式を書いてください。

=XLOOKUP(E2, $A$2:$A$100, $B$2:$B$100, "取引なし")

まとめ

XLOOKUP は、何も特別な指定をしなければ
「検索範囲を上から順に見て、最初に一致した値を返す」関数です。

検索値・検索範囲・戻り範囲の3つさえ正しく指定できれば、
左方向でも右方向でも、最初の一致をシンプルに取ることができます。
見つからないときのメッセージや空欄対策も含めて、
自分用の“型”としてコピーして使い回していくと、どんどん楽になります。

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