概要
「同じコードや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つさえ正しく指定できれば、
左方向でも右方向でも、最初の一致をシンプルに取ることができます。
見つからないときのメッセージや空欄対策も含めて、
自分用の“型”としてコピーして使い回していくと、どんどん楽になります。
