VLOOKUPとXLOOKUPを列番号と列名で理解する

VLOOKUPとXLOOKUPを列番号と列名で理解する

「何列目を返す」から「どの列を返す」へ

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

VLOOKUPとXLOOKUPの違いは、「古い関数」と「新しい関数」の違いだけではありません。実務上もっと大きいのは、戻す列の指定方法です。

VLOOKUPは、表の中で「何列目を返すか」を指定します。

XLOOKUPは、「どの列を返すか」を指定します。この違いによって、数式の読みやすさ、列追加への強さ、表設計への影響が変わります。

この記事では、VLOOKUPを悪者にせず、XLOOKUPを万能扱いもしません。両者の構造の違いを、列番号と列名の違いとして整理します。

本記事の対象とゴール

想定読者

この記事は、次のような人を対象にしています。

  • VLOOKUPは使えるが、XLOOKUPとの違いを言語化したい人

  • VLOOKUPの列番号が怖いと感じたことがある人

  • 既存ブックをXLOOKUPへ置き換えるべきか迷っている人

  • Excelテーブルや構造化参照と検索関数の関係を整理したい人

本記事で得られること

この記事を読むと、次のことが整理できます。

  1. VLOOKUPが「何列目」を返す関数であること

  2. XLOOKUPが「どの列」を返す関数であること

  3. 表全体を渡す考え方と、検索列・戻り列を分けて渡す考え方の違い

  4. 列挿入で壊れやすい数式の見分け方

  5. 新規ブックと既存ブックでの使い分け

本記事で扱わないこと

この記事では、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へ一括置換する必要はありません。

既存ブックで見るべきなのは、次の点です。

  1. 第4引数が省略されていないか

  2. 完全一致が必要なところで FALSE が入っているか

  3. 列番号が表の意味と合っているか

  4. 左端列が検索キーとして正しいか

  5. 列追加で壊れる可能性があるか

問題があるところから直します。

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