【中級者向け】 Excelの XLOOKUP関数、VLOOKUP関数のユニークな仕様 5選(Googleスプレッドシート職人から見た)
先週に続いて、ExcelやGoogleスプレッドシートで人気の高い VLOOKUP関数、XLOOKUP関数についてです。
先週のnoteでは Googleスプレッドシートにおける XLOOKUP関数よりもVLOOKUP関数を使った方がいいシーン 3選を書きました。
今回はXLOOKUP関数ネタの続きとして、Googleスプレッドシート職人から見た、ExcelのXLOOKUP、VLOOKUPのユニークな仕様5選 と題し、同じ関数でもスプレッドシートとは違う機能や挙動について触れていきます。
なお、今回も幾つかお題がありますが、これらはGoogleスプレッドシートの関数クイズとなります。
Excelユーザーの方は申し訳ありませんが、ご了承ください。(興味があればチャレンジしてみてください)
Googleスプレッドシートから見た ExcelのXLOOKUPの独自仕様 5選
先週の最後に書きましたが、GoogleスプレッドシートのVLOOKUP、XLOOKUPと ExcelのVLOOKUP、XLOOKUPは、基本的には同じように使える関数です。
ただ、細かいところで挙動が違っていたり、Excel側にしか無い機能があったりします。
今回取り上げる 5つは
■Googleスプレッドシートから見た ExcelのXLOOKUPの独自仕様
1. XLOOKUPはセル参照を返す
2. XLOOKUPは空白を検索できる
3. XLOOKUPは検索で全角・半角を区別しない
4. XLOOKUPは正規表現で検索できる (※365限定)
5. XLOOKUPやVLOOKUPは基本的には縦横スピルできない
これらです。
Excelを嗜んでる方は「こんなの全部知ってるよ」って思うかもしれませんが、Googleスプレッドシートとの挙動の違いを楽しんでいただければと思います。(そしてスキをポチっとお願いします)
Googleスプレッドシート職人のmirは、Excel関数の知識が不十分である為、誤った情報や洩れがあればお知らせください。
一つずつ解説していきましょう!
1. ExcelのXLOOKUPはセル参照を返す
Excelでは
VLOOKUP関数 ・・・ 値を返す
XLOOKUP関数 ・・・ セル参照を返す
という違いがあります。

セル参照を返す、とはどういうことか?
=OFFSET(VLOOKUP(F4,A2:D6,2,FALSE),0,1)
たとえば、👆こんな式で XLOOKUPの結果をOFFSETで一つ右にズラしたり

=XLOOKUP(F4,A2:A6,B2:D6):XLOOKUP(F5,A2:A6,B2:D6)
:(範囲演算子)で2つのXLOOKUPを繋いだ 👆こんな式で 2つの検索キーの間の範囲をまるっと取得したりが可能ってことです。
他にもROWやCOLUMNといった範囲にしか使えない関数が、XLOOKUPの結果に対して利用可能となっています。
一方 ExcelのVLOOKUPは値を返す関数となっており、

XLOOKUPと同じように OFFSET関数やROW関数でネストしても、式は機能しません。
Googleスプレッドシートは、XLOOKUPとVLOOKUP どちらもセル参照返し
ではGoogleスプレッドシートの場合はどうか?
Googleスプレッドシートでは、VLOOKUPとXLOOKUPどちらもセル参照を返す仕様となっています。

ただし VLOOKUPの場合はなぜか、第3引数に1を指定した時と、第3引数に配列を指定した時は、参照返しではなくなるので注意が必要です。

配列指定はなんとなく理解できますが、1指定だと 参照じゃなくなるのは謎仕様です。。
Q1. VLOOKUP関数を使って 指定した開始コード から 終了コードまでの範囲を取得したい
あまり実践では使わない例ですが、GoogleスプレッドシートのVLOOKUPの参照返しを使ったお題にチャレンジしてみましょう。

こんな感じで 一意の担当者コードが昇順にならんでいる表に対して、F2とH2セルで 担当者コードを指定した場合、2つのコードの間の行範囲の 氏名、部門コード、部門名を取得したい。
VLOOKUP関数を使うという前提条件があった場合、G4にどのような式を入れればよいでしょうか?
エラー時の処理や汎用性は考慮不要とします。
※簡単すぎ!って人は開始や終了の担当者コードが空白だった際に 開始行、終了行からの範囲を返すように式をアレンジしてみましょう!
データはこちら 👇
担当者コード 氏名 部門コード 部門名
S001 山田 太郎 D01 営業部 S002 ~ S003
S002 佐藤 花子 D02 企画部 氏名 部門コード 部門名
S003 鈴木 一郎 D03 総務部
S004 高橋 健二 D01 営業部
S005 伊藤 結衣 D02 企画部 考えてみましょう!
↓↓
回答はここから。
↓↓
A1. VLOOKUP関数を使って 指定した開始コード から 終了コードまでの範囲を取得する
回答です。ARRAYFORMULAは使いません。

=VLOOKUP(F2,A2:D6,2,FALSE):VLOOKUP(H2,A2:D6,4,FALSE)
先ほど書いた通り 第3引数を配列にするとセル参照ではなくなるので、最初のVLOOKUPの式では第3引数を 2(左上)、後ろのVLOOKUPの式では第3引数を4(右下)とすることで、

このように 対角線でセル範囲を取得できます。
注意点として、VLOOKUPの見つからなかった場合の対策は IFNA関数が一般的ですが、IFNAやIFERRORでVLOOKUPをネストすると

参照返しが失われてしまいます。
その為、IDが未選択(空白)の対応を式に含める場合は

=VLOOKUP(IF(F2="",A2,F2),A2:D6,2,FALSE):VLOOKUP(IF(H2="",A6,H2),A2:D6,4,FALSE)
このようにIF関数を使う必要があります。IF関数はVLOOKUPの外側でもOK。
👆最近こんなネット記事がありましたけど、まだまだ IF関数は重要な関数だと個人的には思います。
Excelは XLOOKUPの第4引数も参照を返す(Googleスプレッドシートは値返し)
もう1つ、Googleスプレッドシートでは、XLOOKUPの 第4引数「見つからなかった時の値」も参照返しとはなりません。
第4引数にセル参照を入れても、

👆このように #N/Aエラーとなります。
一方 ExcelのXLOOKUPは、第4引数も参照返しとなっています。
第4引数にをセル指定とすると

👆検索キーが見つからなかった時に、第4引数で指定したA2セル(先頭)からの範囲を出力させることが出来ます。
2. ExelのXLOOKUPは空白を検索できる
Excelでは
VLOOKUP関数 ・・・ 空白を検索できない(0にマッチする)
XLOOKUP関数 ・・・ 空白を検索できる(0と区別して空白にマッチ)
という違いがあります。

検索範囲の空白より上の行に 0が存在していた場合、VLOOKUPは 0の行にマッチして、2列目の「数値 0」を返しますが、XLOOKUPでは 空白セルが検索にマッチし、2列目 「空白」を返しているのがわかりますね。
これは
=XLOOKUP(D2,A1:A8,B1:B8) として 空白セルのD2を参照した場合も、
=XLOOKUP(,A1:A8,B1:B8) として 第1引数を空とした場合も、
どちらも一緒です。
範囲の順番を 空文字、空白、0 とした場合でも

VLOOKUPの空白検索は 0に、 XLOOKUPの空白検索は空白にマッチ(空文字はスルー)します。
ちなみに 検索範囲に 0が無い場合は、VLOOKUPの空白検索は #N/Aとなります。
また、空白ではなく 空文字 ""(または ') を検索した場合は、VLOOKUP、XLOOKUPどちらも数値0や空白にはマッチせず、空文字にマッチします。

MATCH関数、XMATCH関数も同様で、

MATCHで空白を検索すると 0にマッチし、XMATCHで空白を検索した場合は 空白に正しくマッチします。
空白を検索する時なんてある?と思うかもしれませんが、たまーに便利だったりします。
以前どこかで見かけたExcelクイズ(もしくはQAサイトの質問)で使える場面があった記憶なんですが・・・完全に失念しちゃいました。
良い事例を提示できずすいません。
ま、忘れちゃうくらいなんで、さほど重要ではないのかと。
GoogleスプレッドシートのXLOOKUPは空白検索ができない

GoogleスプレッドシートのXLOOKUPは、残念ながら 空白を検索することは出来ません。
空白を検索した場合は 数値の0にマッチし、空文字は空文字にマッチする仕様となっています。
これはXLOOKUPだけでなく、VLOOKUP、MATCH関数、XMATCH関数も同様で、いずれも直接空白の検索が出来ません。
Q2. GoogleスプレッドシートでXLOOKUPでA列で空白を検索してB列の値を返したい
もちろん、他の関数と組み合わせれば Googleスプレッドシートでも XLOOKUPによる空白検索は可能です。
というわけで、あまり実用的ではありませんが簡単なお題いってみましょう。

このように Googleスプレッドシートで XLOOKUP関数を使ってA列の空白を上から検索し B列の値を返したい場合、どのような式を作ればよいでしょうか?
空文字を区別し、空のセルを検索するものとします。
2 数値 2
a テキスト a
FALSE ブール値 FALSE
0 数値 0
TRUE ブール値 TRUE
' 空文字
空白
1 数値 1データは👆こちらをA1に貼って利用ください。
考えてみましょう!
↓↓
回答はここから。
↓↓
A2. GoogleスプレッドシートでXLOOKUPでA列で空白を検索してB列の値を返す
回答です。

=XLOOKUP(TRUE,ARRAYFORMULA(ISBLANK(A:A)),B:B,)
空文字と区別して空白セルを判定したいので、ISBLANK関数を使います。このISBLANK関数を複数セルに利用したいので、ARRAYFORMULA関数でネスト(一番外側でもOK)、これがXLOOKUPの第2引数となります。
で、ISBLANKは空白だったらTRUEを返すので、XLOOKUPの第1引数をTRUEとすれば 一番最初(一番上)の空白セルが検索出来るわけです。
出来るっちゃ出来るんですが、Excelに比べると気軽とは言えませんね。
3. ExcelのXLOOKUPは全角、半角を区別しない
Excelでは
VLOOKUP関数 ・・・ 全角文字、半角文字を区別して検索
XLOOKUP関数 ・・・ 全角文字、半角文字を区別せず検索
という違いがあります。

👆たとえば 半角の リンゴ を検索して2列目の数値を返す際に、VLOOKUP関数では 正しく3を返していますが、XLOOKUP関数では リンゴより上にある 全角のリンゴが リンゴと同じとみなされ 2という結果が返っています。
この仕様はXLOOKUPに限らずで、スピル実装後に追加されたExcelの新関数は半角・全角を区別しない傾向があります。

👆例として UNIQUE関数やGROUPBY関数において、 リンゴがより上の行にあるリンゴと同一とみなされているのがわかりますね。
XLOOKUPと同様に

XMATCH関数も Excelの場合は、MATCH関数と違って 全角・半角を区別しません。
これは英語環境だと発生しないようで、日本語環境で発生するバグみたいなものらしいです。
もちろん、半角・全角が混在する表記ゆれがあるデータを検索する際は、XLOOKUPのこの仕様が役立つこともあります。

ただ半角・全角を区別したい時は困ることがあります。
ExcelのXLOOKUP関数で半角、全角を区別して検索する裏技
じゃあ、XLOOKUPで 半角、全角区別したいよーって時はどうすればよいか?
これは、第5引数の一致モードを2(ワイルドカードモード)指定 で利用するという裏技があります。

=XLOOKUP(D2,A2:A4,B2:B4,"",2)

第5引数を 2 指定する際は、 第1引数を "*"&D2"*" といった形でワイルドカードで挟んで 「含む」検索に利用するのが一般的なんですが、
あえて 第5引数を2指定してワイルドカードを利用しないことで、XLOOKUPを厳密な一致判定とすることが可能です。(アルファベットの大文字・小文字の区別はしません)
これで XLOOKUPでも半角、全角を区別することが出来ますね!
GoogleスプレッドシートでもXLOOKUPの 一致モード 2 指定が利用できる
ちなみに一致モードの2指定(ワイルドカードモード)を使って一致判定を厳密にする裏技は、 Googleスプレッドシートでも有効です。
そもそもGoogleスプレッドシートの場合は、VLOOKUPもXLOOKUPも一致基準に違いはなくて、どちらも半角・全角どころか ひらがな・カタカナも区別しないくらい一致判定が緩いんですが、XLOOKUPで検索モード2を指定することで

半角・全角、 ひらがな・カタカナを しっかり区別した結果を返してくれるようになります。
👇こちらは 過去noteで詳しく紹介しています。
複数の検索でXLOOKUPの結果をスピルさせる場合も、

=ARRAYFORMULA(XLOOKUP(D2:D4,A:A,B:B,,2))
このように 第5引数 2指定で、割と厳密に検索した結果を返してくれます。(※ アルファベットの大文字、小文字の区別は出来ない為、「割と」厳密としています)
Googleスプレッドシートのゆるーい一致判定で困っていた人には、これはめっちゃお勧めのハックネタです!
Q3. GoogleスプレッドシートのVLOOKUPでも半角・全角、ひらがな・カタカナを区別して検索したい
GoogleスプレッドシートのXLOOKUP も第5引数 2指定で半角・全角、ひらがな・カタカナを区別した割と厳密な一致判定となりましたが、これを VLOOKUPでも同様に割と厳密に検索をしたい場合は、どんな式を組めばよいでしょうか?

これも実用的なお題ではないんですが、👆E1に入れる式(隠れている部分)をどうすればよいか?
データはこちらを A1セルに貼って利用ください。
りんごジュース 1 リンゴ
青リンゴ 2 リンゴ
りんご 3 りんご
リンゴ 4 りんごジュース
リンゴ 5 青リンゴこの例で限定的に使えるのではなく、汎用的な式を考えてみましょう!
↓↓
回答はここから。
↓↓
A3. GoogleスプレッドシートのVLOOKUPでも半角・全角、ひらがな・カタカナを区別して検索する
まず、XLOOKUPだったら

=ARRAYFORMULA(XLOOKUP(D1:D5,A1:A5,B1:B5,,2))
上で書いた通り、第5引数を2としてワイルドカードモードで検索すれば、このように割と厳密な一致で検索が可能です。
ぶっちゃけ XLOOKUPで解決するんで、実務だったらわざわざVLOOKUPを使う必要はありませんw
とはいえ、VLOOKUPで出来ないわけではありません!

=ARRAYFORMULA(VLOOKUP("*"&D1:D5,A1:B5,2,FALSE))
XLOOKUPと同様にVLOOKUPでもワイルドカードモードとすることで、全角・半角、ひらがな・カタカナを区別した割と厳密な検索に切り替えることが可能です。
ただしVLOOKUPの場合は検索モードを切り替える引数がないので、第1引数に "*" や "?" などのワイルドカード扱いとなるメタ文字を使うことで ワイルドカードモードでの検索とする必要があります。
👆上の場合は 右側の1行目のカタカナの「リンゴ」が、検索範囲でより上にあるひらがなの「りんご」にマッチせず、正しく「リンゴ」にマッチしてるのがわかりますね。
しかし、頭に"*"を付けたことで キーワードで終わるセルを検索(末尾一致検索)となり、

半角の「リンゴ」が左側の「リンゴ」より上にある「青リンゴ」にマッチするという誤判定が発生してしまいます。

後ろにワイルドカードを付けた場合も同様に、「りんご」が「りんごジュース」にマッチしてしまい、正しく判定できません。(?で回避できますが、それでは汎用的とは言えません)
では、どうすればよいか?
回答がこちらです。

=ARRAYFORMULA(VLOOKUP("~"&D1:D5,{"~"&A1:A5,B1:B5},2,FALSE))
"~" はチルダと読みます。
チルダは 通常はワイルドカードである "*"や"?"をエスケープして、ワイルドカードではなく そのままの文字(リテラル)として扱う為のメタ文字です。(これはExcelでも同様)
たとえば

D1セルの「はてな?」を検索しようとすると、?は任意の1文字を表すメタ文字として扱われる為、自動でVLOOKUPがワイルドカード検索となってしまい、A列の「はてな?」より上にある「はてなり」にマッチしてしまいます。
これを ?をSUBSTITUTE関数で ~? に変換することで、?をエスケープしてリテラルとして扱うことで、正しく「はてな?」にマッチさせることが出来ます。
で、この "~" を "~"&D1:D5 として第1引数に使うことで、ワイルドカードを使わずにVLOOKUPをワイルドカード検索にしています。
ただし、頭に"~"がついた値(たとえば「リンゴ」であれば「~リンゴ」)を検索してしまう為、検索範囲側の1列目にも
{"~"&A1:A5,B1:B5}
として、頭に"~"をつけることで 割と厳密な一致判定としつつ、ワイルドカードを気にせず一致判定させています。
GoogleスプレッドシートのVLOOKUPで"~"をそのまま文字として扱う場合はエスケープ不要
注意点として、Excelの場合は

このように"~"チルダは、メタ文字である為そのまま検索できず、チルダ自体をエスケープする必要があります。
VLOOKUPの第1引数で"~"チルダをリテラルとして扱う場合は
"~~"

と2つ重ねて記述する必要があります。
しかし、Googleスプレッドシートの場合はチルダはエスケープする必要がありません。

"~"チルダ のエスケープ処理なんてマニアックな点でも、ExcelとGoogleスプレッドシートで仕様が違うってのは、ちょっとしたトラップですよね。。
4. ExcelのXLOOKUPは正規表現で検索ができる
Excelでは
VLOOKUP関数 ・・・ 正規表現は利用不可(ワイルドカード利用可)
XLOOKUP関数 ・・・ 正規表現で検索可能(第5引数 3指定)
という違いがあります。
365版の Excelでは XLOOKUPだけでなく、XMATCHも、正規表現を使った検索モードを利用することが出来ます。
これらは 2024年にプレビュー版としての導入が発表されましたが、まだ正式導入ではないのか、Excelの公式XLOOKUPのページにも記載がありません。

実は 365版だけでなく 無料のWeb版でも

XLOOKUPの 第5引数 検索モードで 3を指定することで、正規表現モードが利用できます。
一時は無料のWeb版Excelでも 関数ガイドに表示されてた記憶なんですが、

今は表示が出ないようです。
ただし候補には表示されませんが、現状(2026年5月時点)では、この XLOOKUPの第5引数の検索モードで 3(正規表現モード)指定は、無料Web版Excelでも利用可能です。
正規表現は 部分マッチ(含む)判定となります。
XLOOKUPで正規表現を使うことある??
と思うかもしれませんが、たとえば 先ほどのワイルドカードモード検索でも 区別できない アルファベットの大文字・小文字を区別して厳密な一致判定で検索したい時や

=XLOOKUP("^"&D2&"$",A2:A5,B2:B5,"",3)
空文字または空白の先に見つかった方にマッチさせる検索や

=XLOOKUP("^$",A1:A8,B1:B8,"",3)
OR検索で、キーワードのいずれかを含む範囲の一番上にあるものを取得

=XLOOKUP("酸|辛",B2:B5,A2:B5,"",3)
AND検索で、3つのキーワード全てを含む検索をする

=XLOOKUP("(?=.*早)(?=.*安)(?=.*旨)",B2:B5,A2:B5,"",3)
このような使い方が出来ます。
その他 「いきなり答える備忘録」さんが、XLOOUPの正規表現モードの使い方について解説しています。
ただ、XLOOKUPの正規表現モードは非常に動作が重いという話もあります。
大量データ、大量検索の場合は、気軽に使用する前にワイルドカードで対応できないか?よく考えて利用しましょう。
GoogleスプレッドシートのXLOOKUPは正規表現は使えない
このXLOOKUPの正規表現モードは Excelだけの新機能で、Googleスプレッドシートの XLOOKUPには導入されていません。
まぁ FILTER関数にREGEXMATCH関数を組み合わせたり、QUERY関数の where句で matchesを利用することで、ある程度代替は出来ます。

正規表現を使った検索は、XLOOKUPのようにマッチした1件だけを出力するのではなく、FILTER関数やQUERY関数のように 検索に合致したデータを全て取得したい時に使うことが多いんじゃないかなと思います。
5. ExcelのXLOOKUPやVLOOKUPは基本的には縦横スピルできない
Excelでは
VLOOKUP関数 ・・・ 縦横スピルできない(MAPと組み合わせでも▲)
XLOOKUP関数 ・・・ 縦横スピルできない(MAPと組み合わせでも▲)
INDEX関数 + MATCH関数(XMATCH関数) ・・・ 縦横スピルできる
という違いがあります。
前回のnoteで 書いた通り Googleスプレッドシートでは、
VLOOKUPは ARRAYFORMULAと組み合わせて縦横スピルできる
XLOOKUPはMAPと組み合わせて縦横スピルできる
(VLOOKUPもMAPと組み合わせて利用することは可能)
となっていますが、Excelでは VLOOKUP、XLOOKUP どちらも 基本的には縦横スピルが出来ません。
Excelの VLOOKUPも 第3引数を配列指定で 横にスピルするんですが、

第1引数が複数セル指定の場合は、縦方向のスピルが優先され横にスピルしません。
× 縦横両方にはスピルしない
=VLOOKUP(F4:F6,A2:D6,{2,3,4},FALSE)

XLOOKUPの場合も同様で 縦横スピルしようとすると、第1引数が優先となり 横にスピルしません。

× 縦横両方にはスピルしない
=XLOOKUP(F4:F6,A2:A6,B2:D6,"")
Googleスプレッドシートでは使えた MAP + XLOOKUP は、

「範囲を含む配列はサポートされていません」と #CALC!エラーとなります。
MAPやBYROWなど、LAMBDAヘルパー関数で配列の入れ子に対応出来るのはGoogleスプレッドシートの利点の一つです。
Excelでは現状これが出来ません。
ただ見出しで「基本的には」と書いた通り、工夫次第でVLOOKUPやXLOOKUPも縦横スピルさせることは可能です。(スピルさせているのはMAPの機能ですが)
これは最後に触れたいと思います。
Excelで縦横スピル検索は INDEX+MATCH(XMATCH)

というわけでExcelで検索結果を縦横スピルで取得したい場合は、レガシーな手法となりますが
=INDEX(A2:D6,MATCH(F4:F6,A2:A6,0),{2,3,4})
INDEX + MATCH または INDEX + XMATCH を使うのが基本となります。
やはり Excelにおいては、INDEX + MATCH が最強なのかもしれません。
注意点として縦横スピルする場合は、INDEX関数は両方を配列指定する必要があります。
片方を0指定(空白指定)とした場合は、縦横スピルとならないので注意です。

もちろん {2,3,4} 部分は手書きで定数配列を作るだけではなく、この配列をCOLUMN関数で生成した列番号配列を使ったり、

=INDEX(A2:D6,MATCH(F4:F6,A2:A6,0),COLUMN(B1:D1))
見出しの並び順がバラバラだったり、可変対応できるように INDEXの第2引数(行)、第3引数(列)どちらもMATCH関数を使うことで、

=INDEX(A2:D6,MATCH(F4:F6,A2:A6,0),MATCH(G3:I3,B1:D1,0))
フレキシブルな縦横スピル検索が実現できます。
GoogleスプレッドシートではINDEX+MATCH(XMATCH)は縦横スピルしない

Googleスプレッドシートは、 INDEXの仕様がExcelとは違う(第2引数、第3引数に配列が取れない)為、このINDEX + MATCHを使った縦横スピルが 出来ません。

INDEXの第2引数、第3引数を配列を指定した場合は、その先頭の値だけが使われます。(上の場合は {2;3;5} の2だけが使われている)
その為、Googleスプレッドシートにおいて縦横スピルが必要となるケースでは、前回紹介した ARRAYFORMULA + VLOOKUP が大正義だったわけです。
Q4. どうしても Googleスプレッドシートでも INDEX+MATCHで縦横スピルしたい!
こんな人はいないと思いますが・・・一応頑張れば出来るんで、これをお題にしてみましょう。

左側の表を F4:F6の担当者コードで検索して、G3:I3の見出しのデータを取得したい。
これを INDEX関数とMATCH関数の組み合わせ(それ以外の関数も利用可)で、一つの式を作って処理するにはどのような数式をG4セルにいれればよいでしょうか?
ただし、F4:F6と G3:I3 はどちらもプルダウンで可変するものとし、空白の際は空白を返すものとします。

データは 👇をA1に貼って利用ください。
担当者コード 氏名 部門コード 部門名
S001 山田 太郎 D01 営業部
S002 佐藤 花子 D02 企画部 担当者コード 部門名 部門コード 氏名
S003 鈴木 一郎 D03 総務部 S003
S004 高橋 健二 D01 営業部 S001
S005 伊藤 結衣 D02 企画部 S005 考えてみましょう!
↓↓
回答はここから。
↓↓
A4. どうしても Googleスプレッドシートでも INDEX+MATCHで縦横スピルする!
回答です。

=ARRAYFORMULA(
IFERROR(MAP(
IF(G3:I3<>"",F4:F6),IF(F4:F6<>"",G3:I3),
LAMBDA(r,c,
INDEX(B2:D6,MATCH(r,A2:A6,0),MATCH(c,B1:D1,0))
)
))
)ARRAYFORMULAとMAPの両方を使う面倒な式になります。
まず、INDEXが第2引数、第3引数どちらも配列を取れないので、MAPで各行で配列を返すという方法を諦め、MAPの第1引数用に 行見出し、列見出しそれぞれを結果としてほしいサイズの二次元配列に拡張した配列を用意します。


IF関数を使って1列データ(1行)データを二次元配列に拡張しています。この配列処理に ARRAYFORMULA関数が必要となります。
見出しが空の場合、FALSEや空白となりますが、ここでは気にする必要はありません。
この2つの配列の値を r, c として一つずつ取り出すと、セル毎に

このようになります。
これをLAMBDA内の INDEX+MATCH関数で利用するわけです。

見出しが空の場合、#N/Aエラーが出るので IFNA関数を使いたいところですが、

IFNA関数だと片方の見出しがすべて空の場合の「MAPの配列引数のサイズが異なります。」という #VALUE!エラーに対処できないので、IFERROR関数でMAP関数をくくります。

これで、空白時のエラー対処入りの INDEX+MATCHをスピル対応させた式がGoogleスプレッドシートでも作れました。

でもこれなら、ARRAYFORMULA + VLOOKUP +MATCH を使った方が、

=ARRAYFORMULA(IFNA(VLOOKUP(F4:F6,A2:D6,MATCH(G3:I3,A1:D1,0),FALSE)))
だいぶ楽に書けます。
先週書きましたが、やはりGoogleスプレッドシートにおける縦横スピルする検索はVLOOKUPがおススメです!
ExcelでもMAPで欲しい結果と同じサイズの配列を用意すれば VLOOKUP、XLOOKUPは縦横スピルする
上のGoogleスプレッドシートで INDEX+MATCHを縦横スピルさせるお題で気づいた方もいるかと思いますが、Excelで縦横スピルしない VLOOKUPやXLOOKUPも、MAPで最初に結果と同じサイズの検索キー配列を2つ(行と列)用意すれば、縦横スピルが可能です。
■Excelの MAP + VLOOKUP + MATCH(XMATCH)による縦横スピル

=MAP(IF(G3:I3<>"",F4:F6),IF(F4:F6<>"",G3:I3),LAMBDA(r,c,
VLOOKUP(r,A2:D6,MATCH(c,A1:D1,0),FALSE)))
■Excelの MAP + XLOOKUP による縦横スピル

=MAP(IF(G3:I3<>"",F4:F6),IF(F4:F6<>"",G3:I3),LAMBDA(r,c,
XLOOKUP(r,A2:A6,XLOOKUP(c,B1:D1,B2:D6))))
ExcelなのでARRAYFORMULAは不要ですが冒頭部分の
MAP(IF(G3:I3<>"",F4:F6),IF(F4:F6<>"",G3:I3),LAMBDA(r,c,
で、IF関数で検索キーとなる行見出し、列見出しを求める結果のサイズの二次元配列に拡張している点は一緒ですね。
ただ、どう考えても式が複雑ですし、これを使う機会は無いと思います。
縦横スピルによる検索は、
■Googleスプレッドシートなら
ARRAYFORMULA + VLOOKUP + MATCH(XMATCH)
■Excelなら
INDEX + MATCH(XMATCH)
と覚えてしまってもよいでしょう。
XLOOKUPが便利な関数であることは間違いない
先週、今週と2回にわたって、Googleスプレッドシートと Excelそれぞれの XLOOKUPとVLOOKUPについて書きました。
XLOOKUPについては、Googleスプレッドシートに実装された 2022年9月の1か月後の 2022年10月に検証記事を3本書いて以降、改めて触れる機会がなかったので、その後新たに知ったネタを紹介出来て良かったです。
今回は触れませんでしたが XLOOKUP関数には
XLOOKUPは VLOOKUP、HLOOKUP 両方をカバーできる
XLOOKUPは 並びがバラバラでも近似値一致が使える
XLOOKUPは 近似値モード 大 と 小 が使い分けできる
XLOOKUPは 下(右)から検索(逆順検索)が出来る
といった便利な機能が多々あります。
ただ、今回紹介したように VLOOKUPはオワコンとか、一匹残らずVLOOKUPを駆逐してやる とか、は間違いで、
適材適所
「XLOOKUPよりも VLOOKUPを使った方がよいケースもあるし、INDEX+MATCHを使った方がよいケースもある」ってことを知っていただければ幸いです。
ExcelとGoogleスプレッドシートの両方を使ってる人にとっては、微妙に仕様が違うのでなかなか悩ましいですがw
ま、この辺りのメジャーな処理の数式なら、AIに聞けばほぼ間違いない最適な式を返してくれると思うので、今から苦労して無理に覚える必要はないかと思います。(面白いと感じる人が好きで学べばいいんです)
次週は軽めの QuickTipsを書きたいと思います。
いいなと思ったら応援しよう!
チップ大歓迎です。やる気がアップしますw