XLOOKUP は、検索する範囲と結果を返す範囲を別々に指定して値を取り出す Excel の関数で、基本形は =XLOOKUP(検索値, 検索範囲, 戻り範囲) です。 VLOOKUP と違い、列番号を数える必要がなく、検索列より左の列も返せます。既定で完全一致になり、見つからないときに表示する値も引数で指定できます。

この記事では、同じサンプル表に対する XLOOKUP・VLOOKUP・INDEX+MATCH の数式を並べた比較表、6つの引数の早見表(一致モード・検索モードの全値)、複数条件の2方式、#N/A・#VALUE!・#SPILL!・#NAME? を再現する数式と直し方、対応バージョン表を、計算結果つきでまとめます。

確認環境:XLOOKUP の数式は表計算エンジン HyperFormula 3.4.0(Node.js 22)で計算し、同じ答えになる VLOOKUP・INDEX+MATCH の数式を LibreOffice Calc 24.2.7(Ubuntu 24.04、ヘッドレス実行)で検算しました。Calc 24.2 には XLOOKUP 関数がないため、この組み合わせにしています。引数の仕様・対応バージョン・スピルの条件は Microsoft サポートのページの記載です。

XLOOKUPの早見表

構文と6つの引数

=XLOOKUP(検索値, 検索範囲, 戻り範囲, [見つからない場合], [一致モード], [検索モード])
番号 引数 必須 指定する内容 省略したとき
1 検索値 必須 探す値 -
2 検索範囲 必須 検索値を探す1列(または1行) -
3 戻り範囲 必須 結果を取り出す範囲。検索範囲と同じ行数(または列数)にする -
4 見つからない場合 任意 一致がないときに返す値 #N/A を返す
5 一致モード 任意 0・-1・1・2 のいずれか 0(完全一致)
6 検索モード 任意 1・-1・2・-2 のいずれか 1(先頭から)

一致モードの全値

値 意味 向いている場面
0 完全一致。見つからなければ #N/A(既定) コードや ID での検索
-1 完全一致。見つからなければ、次に小さい項目を返す 「以上」の区分表(下限の一覧)から区分を引く
1 完全一致。見つからなければ、次に大きい項目を返す 「以下」の区分表(上限の一覧)から区分を引く
2 ワイルドカード一致(*、?、~ が特別な意味を持つ) 前方一致・部分一致

検索モードの全値

値 意味 向いている場面
1 先頭の項目から検索(既定) 最初に一致した行を返す
-1 末尾の項目から逆方向に検索 最後に一致した行(最新の記録)を返す
2 昇順に並んだ検索範囲を二分探索 行数が多く、昇順に並べ替え済みの表
-2 降順に並んだ検索範囲を二分探索 行数が多く、降順に並べ替え済みの表

二分探索(2 と -2)は、検索範囲が並べ替えられていることが前提です。Microsoft サポートのページには、並べ替えられていない場合は無効な結果が返ると書かれています。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「XLOOKUPの使い方|VLOOKUPとの違い・複数条件・#N/A対処」

この記事で使うサンプル表

セル A1 から次の表が入っているとします。H1:I4 は、単価から区分を決めるための表です。

行 A 商品コード B 商品名 C 分類 D 色 E 単価 F 在庫 H 下限 I 区分
1 商品コード 商品名 分類 色 単価 在庫 下限 区分
2 A001 ノートPC 本体 黒 98000 12 0 C
3 A002 モニター 周辺 黒 32000 8 10000 B
4 A003 キーボード 周辺 白 6800 30 50000 A
5 A004 マウス 周辺 黒 2400 45
6 A005 キーボード 周辺 黒 7200 0
7 A006 ドック 周辺 銀 15800 5

A1 に貼り付けるためのタブ区切りです(G列は空けてあります)。

商品コード   商品名 分類  色   単価  在庫      下限  区分
A001    ノートPC   本体  黒   98000   12      0   C
A002    モニター    周辺  黒   32000   8       10000   B
A003    キーボード   周辺  白   6800    30      50000   A
A004    マウス 周辺  黒   2400    45
A005    キーボード   周辺  黒   7200    0
A006    ドック 周辺  銀   15800   5

XLOOKUP・VLOOKUP・INDEX+MATCH の数式比較表

同じ結果を得るための数式を、3つの書き方で並べました。

やりたいこと XLOOKUP VLOOKUP INDEX+MATCH 結果
コードから商品名 =XLOOKUP("A003",A2:A7,B2:B7) =VLOOKUP("A003",A2:F7,2,FALSE) =INDEX(B2:B7,MATCH("A003",A2:A7,0)) キーボード
コードから単価 =XLOOKUP("A003",A2:A7,E2:E7) =VLOOKUP("A003",A2:F7,5,FALSE) =INDEX(E2:E7,MATCH("A003",A2:A7,0)) 6800
商品名からコード(左の列を返す) =XLOOKUP("マウス",B2:B7,A2:A7) =VLOOKUP("マウス",A2:F7,1,FALSE) は A列を探すため #N/A =INDEX(A2:A7,MATCH("マウス",B2:B7,0)) A004
見つからないときの表示 =XLOOKUP("Z999",A2:A7,B2:B7,"該当なし") =IFERROR(VLOOKUP("Z999",A2:F7,2,FALSE),"該当なし") =IFERROR(INDEX(B2:B7,MATCH("Z999",A2:A7,0)),"該当なし") 該当なし
20000 以下で最大の下限の区分 =XLOOKUP(20000,H2:H4,I2:I4,"",-1) =VLOOKUP(20000,H2:I4,2,TRUE) =INDEX(I2:I4,MATCH(20000,H2:H4,1)) B
「ノート」で始まる商品の単価 =XLOOKUP("ノート*",B2:B7,E2:E7,"",2) =VLOOKUP("ノート*",B2:E7,4,FALSE) =INDEX(E2:E7,MATCH("ノート*",B2:B7,0)) 98000
最後に一致した行の単価 =XLOOKUP("キーボード",B2:B7,E2:E7,"",0,-1) =VLOOKUP("キーボード",B2:E7,4,FALSE) は先頭の行の 6800 =LOOKUP(2,1/(B2:B7="キーボード"),E2:E7) 7200
行と列の見出しの交点 =XLOOKUP("A003",A2:A7,XLOOKUP("在庫",A1:F1,A2:F7)) =VLOOKUP("A003",A2:F7,MATCH("在庫",A1:F1,0),FALSE) =INDEX(A2:F7,MATCH("A003",A2:A7,0),MATCH("在庫",A1:F1,0)) 30

「最後に一致した行」の3列目は、INDEX+MATCH では書きにくいため、同じ結果になる LOOKUP 関数の定番の書き方を載せています。

VLOOKUP との違い

比べる点 XLOOKUP VLOOKUP
返す列の指定 戻り範囲を直接指定 左から数えた列番号
列を挿入したとき 範囲の参照が自動でずれるので結果が変わらない 列番号が固定のため、数え直しが必要
検索列より左の列 返せる 返せない(検索は範囲の左端の列)
一致の既定 完全一致 第4引数を省くと近似一致(=VLOOKUP(20000,H2:I4,2) は B)
見つからないとき 第4引数で指定 IFERROR や IFNA で包む
検索の向き 先頭から・末尾から・二分探索を選べる 先頭から
横方向の表 同じ関数で検索できる HLOOKUP を使う
複数列をまとめて返す 戻り範囲を複数列にするとスピルする 列ごとに数式を書く

INDEX+MATCH との違い

比べる点 XLOOKUP INDEX+MATCH
数式の長さ 関数1つ 関数2つの組み合わせ
左の列を返す できる できる
見つからないとき 第4引数で指定 IFERROR や IFNA で包む
末尾からの検索 検索モード -1 工夫が必要
使える版 Excel 2021 以降と Microsoft 365 以前の版でも使える

以前の版の Excel で開く可能性があるブックは INDEX+MATCH、そうでなければ XLOOKUP という使い分けがわかりやすい基準です。

基本の使い方

完全一致で検索する

=XLOOKUP("A003",A2:A7,B2:B7)

結果は「キーボード」です。検索値をセル(たとえば K2)に入れて =XLOOKUP(K2,A2:A7,B2:B7) と書くのが通常の形です。数式を下へコピーするときは、範囲を絶対参照にします。

=XLOOKUP(K2,$A$2:$A$7,$B$2:$B$7)

大文字と小文字は区別されません。=XLOOKUP("a003",A2:A7,B2:B7) も「キーボード」を返します。

見つからないときの表示を決める

=XLOOKUP("Z999",A2:A7,B2:B7)            → #N/A
=XLOOKUP("Z999",A2:A7,B2:B7,"該当なし")  → 該当なし

第4引数に "" を指定すると空欄に見せられます。

「以上・以下」の区分を引く(一致モード -1 と 1)

H2:I4 の表から、金額 20000 の区分を引きます。

=XLOOKUP(20000,H2:H4,I2:I4,"",-1)       → B(20000 以下で最大の下限は 10000)
=XLOOKUP(20000,H2:H4,I2:I4,"",1)        → A(20000 以上で最小の下限は 50000)
=XLOOKUP(20000,H2:H4,I2:I4,"該当なし",0) → 該当なし(完全一致する行がない)

ワイルドカードで検索する(一致モード 2)

=XLOOKUP("ノート*",B2:B7,E2:E7,"",2)      → 98000
=XLOOKUP("?ウス",B2:B7,A2:A7,"",2)        → A004
=XLOOKUP("ノート*",B2:B7,E2:E7,"該当なし") → 該当なし

* は0文字以上、? は1文字を表します。3つ目のように一致モードを省くと完全一致になり、ワイルドカードの記号は文字そのものとして扱われます。 VLOOKUP は完全一致の指定のままワイルドカードが使えるため、置き換えるときは第5引数に 2 を足します。

最後に一致した行を返す(検索モード -1)

「キーボード」は4行目と6行目にあります。

=XLOOKUP("キーボード",B2:B7,E2:E7,"",0,1)   → 6800(先頭から)
=XLOOKUP("キーボード",B2:B7,E2:E7,"",0,-1)  → 7200(末尾から)

日付順に追記していく記録から、最新の1件を取り出すときに使えます。

横方向の検索と、行・列の交点

検索範囲を1行にすると、横方向に検索します。

=XLOOKUP("単価",A1:F1,A4:F4)                         → 6800
=XLOOKUP("A003",A2:A7,XLOOKUP("在庫",A1:F1,A2:F7))  → 30

2つ目は、内側の XLOOKUP が「在庫」の列(F2:F7)を返し、外側の XLOOKUP がその列から A003 の行を取り出します。

1行分をまとめて返す(スピル)

戻り範囲を複数列にすると、結果が右のセルへ広がります。この動きをスピルと呼びます。A10 に次の数式を入れた結果です。

A10: =XLOOKUP("A003",A2:A7,B2:F7)
セル A10 B10 C10 D10 E10
結果 キーボード 周辺 白 6800 30

数式は A10 の1つだけで、B10〜E10 には自動で値が入ります。

複数条件で検索する2つの方式

「商品名がキーボード、かつ色が黒」のコード(A005)を取り出します。

方式1:検索値と検索範囲を & で連結する

=XLOOKUP("キーボード"&"黒",B2:B7&D2:D7,A2:A7)   → A005

検索範囲側の B2:B7&D2:D7 は、行ごとに「ノートPC黒」「モニター黒」「キーボード白」…という文字列を作ります。検索値も同じ順で連結して探します。

連結した結果が偶然同じになる組み合わせ(「AB」と「C」、「A」と「BC」)があるデータでは、区切り文字を挟みます。

=XLOOKUP("キーボード"&"|"&"黒",B2:B7&"|"&D2:D7,A2:A7)   → A005

方式2:条件式を掛け合わせて 1 を探す

=XLOOKUP(1,(B2:B7="キーボード")*(D2:D7="黒"),A2:A7)   → A005

(B2:B7="キーボード") は行ごとに TRUE/FALSE を返し、掛け算すると TRUE は 1、FALSE は 0 として計算されます。すべての条件を満たす行だけが 1 になるので、検索値 1 で探します。

行 商品名がキーボード 色が黒 掛け算の結果
2 FALSE TRUE 0
3 FALSE TRUE 0
4 TRUE FALSE 0
5 FALSE TRUE 0
6 TRUE TRUE 1
7 FALSE FALSE 0

条件を3つ以上にするときは、かっこを掛け足します。不等号も使えます。

=XLOOKUP(1,(C2:C7="周辺")*(D2:D7="黒")*(F2:F7>=10),B2:B7,"該当なし")  → マウス
=XLOOKUP(1,(B2:B7="マウス")*(D2:D7="白"),A2:A7,"該当なし")            → 該当なし

1つ目は「分類が周辺、色が黒、在庫が10以上」で、モニター(在庫8)は外れ、マウス(在庫45)が返ります。

2つの方式の選び方

比べる点 方式1(& で連結) 方式2(条件式の掛け算)
書きやすさ 短い 条件ごとにかっこが必要
使える条件 等しい、だけ 等しい、以上、以下、等しくない
数値と文字列の混在 連結で文字列になるため気にしなくてよい 条件ごとに型を合わせる
注意する点 連結後に同じ文字列になる組み合わせ すべての範囲の行数をそろえる

INDEX+MATCH でも同じ考え方で書けます。次の3つは、LibreOffice Calc で配列数式として入力し、XLOOKUP と同じ結果になることを確かめました。

=INDEX(A2:A7,MATCH("キーボード"&"黒",B2:B7&D2:D7,0))                   → A005
=INDEX(A2:A7,MATCH(1,(B2:B7="キーボード")*(D2:D7="黒"),0))             → A005
=INDEX(B2:B7,MATCH(1,(C2:C7="周辺")*(D2:D7="黒")*(F2:F7>=10),0))       → マウス

エラーの原因別:再現する数式と直し方

エラー 主な原因 再現する数式 直し方
#N/A 検索値が検索範囲にない =XLOOKUP("Z999",A2:A7,B2:B7) 第4引数に表示したい値を指定する
#N/A 検索値の前後に空白がある =XLOOKUP("A003 ",A2:A7,B2:B7) TRIM で空白を取り除く
#N/A 数値の列を文字列で探している =XLOOKUP("32000",E2:E7,B2:B7) VALUE で数値にそろえる
#N/A ワイルドカードを使ったが一致モードが 0 =XLOOKUP("ノート*",B2:B7,E2:E7) 第5引数に 2 を指定する
#VALUE! 検索範囲と戻り範囲の行数が違う =XLOOKUP("A003",A2:A7,B2:B6) 2つの範囲の開始行と終了行をそろえる
#SPILL! スピル先のセルに値が入っている A10 に =XLOOKUP("A003",A2:A7,B2:F7)、C10 に文字 スピル先を空にする
#NAME? 関数名のつづりが違う =XLOKUP("A003",A2:A7,B2:B7) XLOOKUP に直す
#NAME? XLOOKUP がない版で開いた =XLOOKUP("A003",A2:A7,B2:B7) INDEX+MATCH に置き換える

#N/A:検索値が見つからない

=XLOOKUP("A003 ",A2:A7,B2:B7)             → #N/A
=XLOOKUP(TRIM("A003 "),A2:A7,B2:B7)       → キーボード

=XLOOKUP("32000",E2:E7,B2:B7)             → #N/A
=XLOOKUP(VALUE("32000"),E2:E7,B2:B7)      → モニター

見た目が同じでも、末尾の空白や、数値と文字列の違いがあると一致しません。ほかのシステムから取り込んだデータで起こりやすい原因です。検索値ではなく表の側に空白がある場合は、表の列を TRIM で整えた列を別に作ると直せます。

「見つからないこと」が正常な場合は、第4引数で表示を決めます。

=XLOOKUP("Z999",A2:A7,B2:B7,"該当なし")   → 該当なし

#VALUE!:検索範囲と戻り範囲の大きさが違う

=XLOOKUP("A003",A2:A7,B2:B6)   → #VALUE!
=XLOOKUP("A003",A2:A7,B2:B7)   → キーボード

検索範囲が6行、戻り範囲が5行になっています。行を追加したあとに片方の範囲だけを広げたときに起こります。表を Excel のテーブルにして列名で参照すると、行を足しても2つの範囲が同時に広がります。

この種類のエラーは、第4引数では置き換わりません。第4引数が働くのは「見つからなかった」ときだけです。

=XLOOKUP("A003",A2:A7,B2:B6,"該当なし")   → #VALUE!

#SPILL!:結果を広げる先がふさがっている

A10 に1行分を返す数式を入れ、C10 に「メモ」という文字が入っている状態です。

セル A10 B10 C10
結果 #SPILL! (空) メモ

C10 を空にすると、A10 から E10 に「キーボード・周辺・白・6800・30」が表示されます。Microsoft サポートの日本語のページでは、このエラーは「#スピル!」と表記されています。

Microsoft サポートのページには、#スピル! の原因として次の内容が挙げられています。

原因(Microsoft サポートの記載) 直し方の例
スピル範囲が空ではない スピル先のセルの値を消すか、数式を別の場所に移す
結合されたセルにスピルしようとしている セルの結合を解除する
Excel のテーブルの中にスピルする数式がある テーブルの外に数式を置くか、テーブルを範囲に変換する
ワークシートの端を超えて広がる 参照する範囲を必要な行・列だけに絞る
配列のサイズが決まらない、メモリが足りない 参照する範囲を小さくする

#NAME?:関数名が認識されない

=XLOKUP("A003",A2:A7,B2:B7)   → #NAME?

つづりの誤りのほか、XLOOKUP に対応していない版で開いたときにも表示されます。今回の検算に使った LibreOffice Calc 24.2 でも、=XLOOKUP("A003",A2:A7,B2:B7) は #NAME? になりました。配布先の版がそろっていないブックでは、INDEX+MATCH で書いておくと同じ結果を表示できます。

XLOOKUPの対応バージョン

Microsoft サポートの XLOOKUP 関数のページに記載されている内容です。

製品 XLOOKUP
Excel for Microsoft 365(Windows・Mac) 使える
Excel 2024(Windows・Mac) 使える
Excel 2021(Windows・Mac) 使える
Excel 2019 使えない
Excel 2016 使えない
Excel for iPad・iPhone 使える
Excel for Android(タブレット・スマートフォン) 使える

Excel 2019・2016 で同じ結果を得るには、比較表の INDEX+MATCH の列の数式を使います。

よくある質問

Q. VLOOKUP を XLOOKUP に書き換えるとき、気をつけることは? A. 3点あります。VLOOKUP で第4引数を省略または TRUE にしていた数式は近似一致なので、XLOOKUP では一致モードに -1 を指定します。ワイルドカードを使っていた数式には一致モード 2 を足します。IFERROR で包んでいた部分は、第4引数に移せます。

Q. 見つからないときに 0 や空欄を表示するには? A. 第4引数に 0 や "" を指定します。=XLOOKUP("Z999",A2:A7,E2:E7,0) は 0 を、=XLOOKUP("Z999",A2:A7,B2:B7,"") は空の文字列を返します。合計などの計算に使う列は 0、表示だけの列は "" が向いています。

Q. 行数が多いと遅くなりますか? A. 既定の検索モードは先頭の項目から順に探します。検索範囲が昇順または降順に並べ替え済みの表では、検索モード 2 または -2 の二分探索を指定できます。並べ替えられていない範囲に指定すると無効な結果になるため、並び順を保てる表に限って使います。

まとめ

  • 基本形は =XLOOKUP(検索値, 検索範囲, 戻り範囲)。既定で完全一致になり、左の列も返せる
  • 第4引数で見つからないときの表示を指定でき、IFERROR で包む必要がない
  • 一致モードは 0・-1・1・2、検索モードは 1・-1・2・-2。ワイルドカードを使うときは一致モード 2 を指定する
  • 複数条件は、& で連結する方式と、条件式を掛けて 1 を探す方式の2つ。不等号を使うなら掛け算の方式
  • #N/A は検索値の空白や型の違い、#VALUE! は範囲の行数、#SPILL! はスピル先のセル、#NAME? はつづりと対応版を確認する
  • Excel 2019・2016 では XLOOKUP が使えないため、配布先の版が混ざるブックは INDEX+MATCH で書く

参考・出典

  • Microsoft サポート「XLOOKUP 関数」(構文、一致モード・検索モードの値、適用対象の製品)
  • Microsoft サポート「#スピル! エラーを修正する方法」(スピルエラーの原因)

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「XLOOKUPの使い方|VLOOKUPとの違い・複数条件・#N/A対処」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?