VLOOKUPとXLOOKUPを列番号と列名で理解する
「何列目を返す」から「どの列を返す」へ
Copyright © 2026 LWP 山中 一弘
本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。
記事要約
VLOOKUPとXLOOKUPの違いは、「古い関数」と「新しい関数」の違いだけではありません。実務上もっと大きいのは、戻す列の指定方法です。
VLOOKUPは、表の中で「何列目を返すか」を指定します。
XLOOKUPは、「どの列を返すか」を指定します。この違いによって、数式の読みやすさ、列追加への強さ、表設計への影響が変わります。
この記事では、VLOOKUPを悪者にせず、XLOOKUPを万能扱いもしません。両者の構造の違いを、列番号と列名の違いとして整理します。
本記事の対象とゴール
想定読者
この記事は、次のような人を対象にしています。
VLOOKUPは使えるが、XLOOKUPとの違いを言語化したい人
VLOOKUPの列番号が怖いと感じたことがある人
既存ブックをXLOOKUPへ置き換えるべきか迷っている人
Excelテーブルや構造化参照と検索関数の関係を整理したい人
本記事で得られること
この記事を読むと、次のことが整理できます。
VLOOKUPが「何列目」を返す関数であること
XLOOKUPが「どの列」を返す関数であること
表全体を渡す考え方と、検索列・戻り列を分けて渡す考え方の違い
列挿入で壊れやすい数式の見分け方
新規ブックと既存ブックでの使い分け
本記事で扱わないこと
この記事では、VLOOKUPやXLOOKUPの全オプションは網羅しません。
また、Power Query、リレーショナルデータベース、ピボットテーブルによる表設計全体の話も中心にはしません。表設計そのものについては、関連記事「VLOOKUPに合わせた表設計と正規化崩しを考える」で扱っています。
この記事では、検索関数そのものの構造に焦点を当てます。
先に結論
VLOOKUPとXLOOKUPの違いは、次のように考えると分かりやすくなります。
VLOOKUP この表の左端で検索して、何列目を返すかXLOOKUP この列で検索して、この列を返すVLOOKUPは、表の位置関係に依存します。
XLOOKUPは、検索する列と返す列を分けて指定します。
そのため、XLOOKUPのほうが「数式が何をしたいのか」を読み取りやすくなります。
ただし、これは「VLOOKUPが悪い」という意味ではありません。
古いExcelとの互換性、既存ブックの保守、単純な表での利用では、VLOOKUPが現実的な選択になることもあります。
新しく作るブックでは、基本的にXLOOKUPとExcelテーブルを組み合わせるほうが、意味の分かる数式になりやすいです。
1. VLOOKUPは「何列目」を返す
VLOOKUPの基本形は、次のようになります。
=VLOOKUP(検索値, 範囲, 列番号, 検索方法)たとえば、商品コードから商品名を取得する数式は、次のようになります。
=VLOOKUP(A2, 商品マスタ!A:D, 2, FALSE)この数式が言っていることは、次の内容です。
A2の値を、商品マスタ!A:D の左端列で探す。見つかった行の、範囲内で2列目の値を返す。完全一致で探す。ここで重要なのは、戻り列が「商品名列」ではなく「2列目」として指定されていることです。
人間が知りたいのは商品名です。
しかし、VLOOKUPに渡しているのは列番号です。
そのため、数式を読んだ人は、2 が何を意味するのかを表まで見に行く必要があります。
2. XLOOKUPは「どの列」を返す
XLOOKUPの基本形は、次のようになります。
=XLOOKUP(検索値, 検索範囲, 戻り範囲)同じ商品コードから商品名を取得するなら、次のように書けます。
=XLOOKUP(A2, 商品マスタ!A:A, 商品マスタ!B:B)Excelテーブルを使っていれば、さらに意味が見えやすくなります。
=XLOOKUP([@商品コード], 商品マスタ[商品コード], 商品マスタ[商品名])この数式が言っていることは、次の内容です。
この行の商品コードを、商品マスタの商品コード列で探す。見つかった行の商品名列を返す。VLOOKUPでは、戻り列は「2列目」でした。
XLOOKUPでは、戻り列は「商品名列」です。
この違いが、実務上かなり大きいです。
3. 表全体を渡すか、列を分けて渡すか
VLOOKUPでは、検索範囲と戻り範囲を含む表全体を渡します。
そして、その表の中で何列目を返すかを列番号で指定します。
VLOOKUP 入力: 表全体 検索: 表の左端列 戻り値: 表の中の何列目XLOOKUPでは、検索列と戻り列を分けて渡します。
XLOOKUP 入力: 検索列 入力: 戻り列 戻り値: 戻り列の対応する位置この違いは、数式の保守性に影響します。
VLOOKUPでは、表の構造と列番号を頭の中で対応させる必要があります。
XLOOKUPでは、数式の中に検索列と戻り列がそのまま出ます。
つまり、XLOOKUPのほうが、数式が仕様に近くなります。
4. CellsとRangeの比喩
この違いは、VBAの Cells と Range の感覚に少し似ています。
これは厳密なオブジェクトモデルの説明ではなく、あくまで比喩です。VBAでは Cells も Range オブジェクトを返します。
ただし、指定の感覚としては次の違いがあります。
Cells(2, 3)Range("商品名")Cells(2, 3) は、2行目3列目という位置で指定しています。
Range("商品名") は、名前や意味で指定しています。
VLOOKUPの列番号は、位置で指定する感覚に近いです。
XLOOKUPでExcelテーブルの構造化参照を使うと、列の意味で指定する感覚に近づきます。
=XLOOKUP([@商品コード], 商品マスタ[商品コード], 商品マスタ[商品名])この数式は、「何列目か」ではなく、「商品コードで探して商品名を返す」と読めます。
5. 列挿入で静かに壊れる危険
VLOOKUPの怖さは、必ずエラーになることではありません。
むしろ、エラーにならずに違う列を返すことがあります。
たとえば、次のような表があるとします。
商品コード | 商品名 | 単価 | 区分商品名を返すために、次の数式を書いていたとします。
=VLOOKUP(A2, 商品マスタ!A:D, 2, FALSE)ここで、商品コードと商品名の間に新しい列を挿入したとします。
商品コード | 旧コード | 商品名 | 単価 | 区分VLOOKUPの列番号 2 がそのままだと、返るのは商品名ではなく旧コードになります。
このとき、旧コードも文字列であれば、数式はエラーにならないかもしれません。
しかし、結果は間違っています。
これが、静かに壊れる危険です。
XLOOKUPで構造化参照を使っていれば、戻り範囲は 商品マスタ[商品名] として指定できます。
列の位置が変わっても、商品名列を返す意図が数式に残ります。
6. 近似一致は欠陥ではない
VLOOKUPでよくある事故の1つは、第4引数を省略することです。
=VLOOKUP(A2, 商品マスタ!A:D, 2)VLOOKUPでは、第4引数を省略すると近似一致になります。
完全一致でIDやコードを探したい場合は、通常 FALSE を明示します。
=VLOOKUP(A2, 商品マスタ!A:D, 2, FALSE)ただし、近似一致そのものが悪いわけではありません。
近似一致は、税率表、ランク表、料金表のように、範囲で値を決める用途では意味があります。
また、並べ替え済みデータに対する近似一致は、歴史的には高速検索のためにも重要でした。
問題は、完全一致で探すべき商品コードや社員番号の検索で、意図せず近似一致になってしまうことです。
XLOOKUPは、既定で完全一致です。
この点でも、新しく作る数式ではXLOOKUPのほうが事故を減らしやすくなります。
7. それでもVLOOKUPを使う場面
VLOOKUPをすべてXLOOKUPへ置き換えればよい、という話ではありません。
VLOOKUPを使う理由はあります。
古いExcelでも動かす必要がある
Excel 2016やExcel 2019でも開く必要がある
既存ブックで大量に使われている
表が単純で、左端キーと列番号の関係が明確である
置き換えによる検証コストのほうが高い
特に既存ブックでは、関数を置き換えること自体がリスクになります。
VLOOKUPで正しく動いている数式を、理由なくXLOOKUPへ一括置換する必要はありません。
既存ブックで見るべきなのは、次の点です。
第4引数が省略されていないか
完全一致が必要なところで FALSE が入っているか
列番号が表の意味と合っているか
左端列が検索キーとして正しいか
列追加で壊れる可能性があるか
問題があるところから直します。
8. 新しく作るならXLOOKUPとExcelテーブル
新しくブックを作るなら、基本的にはXLOOKUPとExcelテーブルを組み合わせるほうが分かりやすくなります。
理由は、数式が仕様に近くなるからです。
=XLOOKUP([@商品コード], 商品マスタ[商品コード], 商品マスタ[単価])この数式は、次のように読めます。
この行の商品コードを、商品マスタの商品コード列で探し、商品マスタの単価列を返す。列番号を覚える必要がありません。
また、表の途中に列を追加しても、構造化参照が列名を追いかけてくれます。
もちろん、列名を変えれば影響は出ます。
しかし、その場合は列名の変更という意味のある変更です。
列の位置が変わっただけで、数式の意味が静かに変わるよりは、ずっと管理しやすくなります。
9. 「旧関数だから悪い」ではなく、指定方法の違いを見る
VLOOKUPを古い関数、XLOOKUPを新しい関数とだけ見ると、判断を間違えます。
大事なのは、何をどう指定しているかです。
VLOOKUP 表の左端で検索する。 返す列は、範囲内の列番号で指定する。XLOOKUP 検索する列を指定する。 返す列を指定する。この違いが、表設計にも影響します。
VLOOKUPでは、検索キーを表の左端へ置く必要があります。
そのため、VLOOKUPに合わせて表の形を変えることがあります。
一方、XLOOKUPでは、検索列と戻り列を分けて指定できるため、VLOOKUPほど左端列に縛られません。
ただし、だからといって表設計を雑にしてよいわけではありません。
検索キーが一意であること、マスタが重複していないこと、列名が意味を持っていることは、XLOOKUPでも重要です。
10. 実務での使い分け
実務では、次のように考えると判断しやすくなります。
新しく作るブックでは、原則としてXLOOKUPとExcelテーブルを使います。
=XLOOKUP([@商品コード], 商品マスタ[商品コード], 商品マスタ[商品名])既存ブックでは、まずVLOOKUPを点検します。
=VLOOKUP(A2, 商品マスタ!A:D, 2, FALSE)点検するのは、次の点です。
第4引数が意図どおりか
列番号が正しいか
検索キーが左端にあるか
列追加で壊れないか
置き換えることで検証範囲が広がりすぎないか
互換性が必要なら、VLOOKUPを使い続ける判断もあります。
ただし、その場合でも FALSE の明示、列番号の確認、表構造の固定は必要です。
まとめ
VLOOKUPとXLOOKUPの違いは、単なる新旧の違いではありません。
VLOOKUPは、表の左端で検索し、範囲内の何列目を返すかを指定します。
XLOOKUPは、検索する列と返す列を分けて指定します。
この違いにより、XLOOKUPは数式が仕様に近くなり、列追加にも強くなります。
ただし、VLOOKUPが悪いわけではありません。
既存ブック、古いExcel、単純な表では、VLOOKUPを使い続けることも合理的です。
判断の軸は、「新しい関数かどうか」ではありません。
数式を読んだときに、何を検索し、何を返すのかが分かるかどうかです。
出典メモ
元資料: C:\Users\hoehoe\Downloads\vlookup_xlookup_article_source.md
関連記事: 記事135_VLOOKUPに合わせた表設計と正規化崩しを考える260613
Microsoft Support, XLOOKUP function: https://support.microsoft.com/en-us/office/xlookup-function-b7fd680e-6d10-43e6-84f9-88eae8bf5929
Microsoft Support, VLOOKUP function: https://support.microsoft.com/en-us/office/vlookup-function-0bbc8083-26fe-4963-8ab8-93a18ad188a1
Microsoft Learn, Excel performance tips for optimizing performance obstructions: https://learn.microsoft.com/en-us/office/vba/excel/concepts/excel-performance/excel-tips-for-optimizing-performance-obstructions
確認日: 2026-06-21
