XLOOKUP関数(VLOOKUP関数を拡張した新関数)
XLOOKUP関数は、範囲または配列を検索し、見つかった最初の一致に対応する項目を返します。
VLOOKUP関数とHLOOKUP関数の両方の機能を備え、さらに新しい機能まで追加された新関数です。
しかし単純な使い方の場合は、省略値が上手く設定されているためVLOOKUPより簡単に使える場合も多くあります。
引数が増えたので難しく見えてしまいますが、かえってVLOOKUP関数より簡単に使える場合が多くあります。
以下では、かなり詳しく解説しています。
さくっと簡単に使いたいという場合は、以下のページを先にお読みください。
ページ内の目次
XLOOKUP関数の書式
検索する値を指定します。
XLOOKUP関数は文字数制限がなくなりました。
ただし、エクセルの仕様として32768文字以上はセルに入れられません。
検索する範囲または配列を指定します。
指定範囲または配列は、1行または1列のみです。
複数行かつ複数列を指定した場合は、#VALUE!のエラーになります。
見つかった場合に戻す範囲または配列を指定します。
検索範囲が縦の場合は、同じ縦数の範囲または配列を指定してください。
検索範囲が横の場合は、同じ横数の範囲または配列を指定してください。
検索範囲と戻り範囲の大きさが違っている場合は、#VALUE!のエラーになります。
検索値が検索範囲で見つからなかった場合に元す値を指定します。
省略した場合には、見つからなかった場合は#N/A が戻されます。
通常は、省略するか""を指定する使い方が多くなります。
どのような状態を一致とするかを指定します。
0 : 完全一致
-1 : 完全一致または次に小さい項目
1 : 完全一致または次に大きい項目
2 : ワイルドカード文字との一致
省略した場合は、0(完全一致)になります。
(*)半角のアスタリスク:任意の文字列
通常の文字として疑問符やアスタリスクを検索する場合は、その文字の前に、"~*" のように半角のチルダ (~) を付けます。
検索の向きを指定します。
1 : 先頭から末尾へ検索
-1 : 末尾から先頭へ検索
2 : バイナリ検索(昇順で並べ替え)
-2 :バイナリ検索(降順で並べ替え)
省略した場合は、1 (先頭から末尾)になります。
従来の関数の代わりとして
VLOOKUP関数の代わり
※なんちゃって個人情報です。
FALSEは0でも良い。
XLOOKUPでも列指定できます。
HLOOKUP関数の代わり
FALSEは0でも良い。
XLOOKUPでも行指定できます。
検索列より左の列を返す
VLOOKUP関数は検索列より左の列を返せなかったので、INDEX+MATCH等で対応する必要がありましたが、XLOOKUP関数は戻り列を指定できるので、検索列より左の列も戻せます。
(VLOOKUPでも配列を使う事で無理やり左の列を取得できますが、ここでは割愛)
256文字以上の検索
しかし、XLOOKUP関数は文字数制限がなくなりました。
XLOOKUP関数なら文字数は気にする必要がありません。
今まで仕方なく他の方法でやっていたのなら、間違いなくXLOOKUPで簡単かつ確実な数式にすることができます。
XLOOKUP関数をスピルさせる
横にスピルさせる
※XLOOKUP関数の戻り(スピル範囲)は書式設定されないので日付はシリアル値で表示されています。
これはVLOOKUPをスピルさせることでも同じことができます。
縦にスピルさせる
これはVLOOKUPをスピルさせることでも同じことができます。
縦横にスピルさせる
XLOOKUP関数では縦横に同時にスピルさせることはできません。
これについては一番最後で考察しています。
※INDEX関数の戻りは書式設定されないので日付はシリアル値で表示されています。
INDEXもMATCHも検索値に範囲を指定することでスピルします。
これは、単純にINDEXの行番号と列番号に配列を指定して縦横スピルさせたものになります。
これなら、MATCHで検索できさえすれば自由に条件設定できますし、項目順序の入れ替えも可能です。
見つからない場合
これに対応するには、IFERRORを使います。
この機能だけでもVLOOKUPではなくXLOOKUPを使う理由になりえます。
一致モードの使い方
0 : 完全一致
ここまでの使用例が全て完全一致です。
-1 : 完全一致または次に小さい項目
※検索値の順序をわざと崩しています。
一致する値が無かった場合は、検索値を超えない最初に見つかった行になります。
例えば、検索値が5の場合は、5以下で5に最も近い0の行になっています。
「見つからない場合」を指定していないので、0未満の検索値では#N/Aとなります。
これは、VLOOKUPの近似一致と同様の一致方法になります。
上の図のデータは昇順に並んでいないのでVLOOKUPが使えません。
ただし本質的な話としては、大小比較で検索するなら検索範囲は並べ替えておくべきでしょう。
そうしておかないと、結果を見た時に分かりづらくなってしまいます。
1 : 完全一致または次に大きい項目
検索値と完全に一致していればその行になりますが、
一致する値が無かった時は、検索値を超えた最初に見つかった行になります。
例えば、検索値が5の場合は、5以上で5に最も近い10の行になっています。
「見つからない場合」を指定していないので、1000000超の検索値では#N/Aとなります。
2 : ワイルドカード文字との一致
(*)半角のアスタリスク:任意の文字列
検索モードの使い方
1 : 先頭から末尾へ検索
ここまでの使用例が全て1(先頭から末尾)です。
検索値が見つかった最初の行の項目が返されます。
-1 : 末尾から先頭へ検索
このように検索値が複数存在し、その一番下の行の項目を取得したい場合に使います。
2 : バイナリ検索(昇順で並べ替え)
これはXLOOKUPが改善されたと言っても、やはり時間がかかります。
検索範囲のどこに検索値があるか分からないのですから、全て探すしかありません。
最初の方で見つかれば良いですが、一番最後の方にあったとしたら・・・
先のページのように、今までは検索値の各行に数式を入れる必要がありましたが、スピルによって先頭行に数式を入れるだけで済んでしまいます。
従って、上記VLOOKUPをXLOOKUPで書き換えるなら、
=XLOOKUP(D2:D200001,A2:A200001,B2:B200001,,-1,2)
このように一致モードを-1で指定すれば同じ結果が得られます。
上図の20万件が一瞬で処理されています。
-2 :バイナリ検索(降順で並べ替え)
検索範囲が降順に並んでいる場合は、こちらを指定してください。
これは、VLOOKUPにはなかった機能になります。
XLOOKUP関数をネストして戻り列を可変にする
I2=XLOOKUP($G$2:$G$4,$B$2:$B$51,XLOOKUP(I1,$A$1:$E$1,$A$2:$E$51))
※XLOOKUPは縦横スピルさせられないので、列ごとに数式を入れる必要があります。
※H2をI2にコピーできるように絶対参照を適宜入れています。
=XLOOKUP(H1,$A$1:$E$1,$A$2:$E$51)
少々複雑な数式になっていますが、XLOOKUPだけで実現できている点は良いと思います。
これは、内側のXLOOKUPをFILTERに書き直すことでもできます。
I2=XLOOKUP($G$2:$G$4,$B$2:$B$51,FILTER(B2:F51,B1:F1=I1))
XLOOKUP関数の戻りセル範囲を別の関数で使う
計算範囲として使う
これはXMACHとINDEXもしくはOFFSETとの組み合わせでもできます。
=SUM(OFFSET(B1,XMATCH(D3,A:A,0)-1,0):OFFSET(B1,XMATCH(D4,A:A,0,-1)-1,0))
このように見比べると、XLOOKUPが一番数式がすっきりしていて良さそうに見えます。
OFFSETでずらす
P2セルの商品でA列を検索して、各月の売上、予算、予算比を取得します。
この場合は、OFFSET+MATCHでも同じ事ができます。
XLOOKUP関数が縦横に同時にスピルしないことについて
あくまで感想レベルの想像ですが、
上記で縦スピルが優先されていることと、複数列を戻り範囲とした場合のXLOOKUPの戻り値が配列ではなくセル範囲になっていることが関係しているように思われます。
しかし、縦スピルさせた場合は、OFFSET出来ません。
そして、このような関数結果は配列で返していると想像できます。
つまり、XLOOKUPの縦スピルは配列を戻し、戻り範囲の複数列は範囲を戻していると考えられます。
この仕様の違いはとても大きいように感じます。
INDEX関数が縦横スピル出来ているのは、複数値を返す場合は配列で返しているからだと考えられます。
したがって、もちろんエクセルのプログラムの組み方次第の話ではありますが、XLOOKUPが今後縦横スピルするようになることはあまり期待できないと思っています。
※ひょっとして、あっと驚くような指定方法で実現できるといったことを僅かに期待してはいますが・・・
この数式は、列番号が0なので、範囲の指定された行の参照を返します。
したがってOFFSETすることができます。
しかし、行番号を配列や複数セル参照にした時には横スピルしません。
範囲を戻す関数について
配列ではなく範囲を返す関数は極めて少ないです。
関数の戻り結果をOFFSET関数でずらすこができる関数としては、
OFFSET関数
INDEX関数
XLOOKUP関数
ただし、
XLOOKUPは縦スピルしている場合はOFFSET出来ません。
INDIRECT関数は、まさにその為の関数ですので当然ですね。
スピルと新関数の練習
XLOOKUP関数のVBA使用例
スピルによって新しく追加された関数
関数名 | 説明 |
FILTER | フィルターは定義した条件に基づいたデータ範囲です。 |
SORT | 範囲または配列の内容を並べ替えます。 |
SORTBY | 範囲または配列の内容を、対応する範囲または配列の値に基づいて並べ替えます。 |
UNIQUE | 一覧表または範囲内から重複データを削除した一覧を返します。 |
RANDARRAY | 0から1までのランダムな数値の配列を返します。 |
SEQUENCE | 1、2、3、4など、配列内の連続した数値の一覧を生成します。 |
XLOOKUP | 範囲または配列を検索し、見つかった最初の一致に対応する項目を返します。 一致が存在しない場合、XLOOKUP は最も近い (概算) 一致を返すことができます。 |
XMATCH | 配列またはセル範囲内の項目の相対的な位置を返します。 |
同じテーマ「エクセル入門」の記事
UNIQUE関数(一意の値)
RANDARRAY関数(ランダム数値)
SEQUENCE関数(連続数値)
XLOOKUP関数(VLOOKUP関数を拡張した新関数)
XMATCH関数(MATCH関数を拡張した新関数)
LET関数(数式で変数を使う)
スピルと新関数の練習(XLOOKUP関数、LET関数、VBAまで)
スピルとは:スピル基礎から応用までの問題集
スピルとは:スピル入門の問題と解説
スピルとは:旧関数でスピルを使う問題と解説
スピルとは:スピルの新関数を使う問題と解説
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。