
VLOOKUP関数で別シートを参照するときは、シート名のうしろに「!」を付けて範囲を指定するだけです。まずは結論となる書き方から確認してください。
=VLOOKUP($A2, 社員マスタ!$A$2:$C$500, 3, FALSE)
ポイントは4つあります。
- シート名!範囲の形で書く(シート名にスペースや記号があれば
'社員 マスタ'!のようにシングルクォーテーションで囲む) - 範囲は「$」で固定する(固定しないと、コピーした瞬間に静かに答えがズレます)
- 第4引数のFALSEは省略しない(省略すると近似一致になり、誤った値が返ることがあります)
- 列番号は手で数えない(列の挿入で、エラーを出さずに別の列の値を返すようになります)
この記事では、上の書き方を土台にしながら、「エラーが出ないのに答えが間違っている」ケースまで含めて解説します。
というのも、VLOOKUPの別シート参照でいちばん怖いのは、赤い「#N/A」が出ることではありません。何事もなかったかのように、違う列の値が表示され続けることです。この記事では実際にExcel互換環境で挙動を検証し、その再現結果をもとに説明しています。
あわせて、よく見かける「型が違うと#VALUE!エラーになる」という説明が誤りであることも、Microsoft公式ドキュメントを根拠に整理します。
症状別|あなたの状況はどれですか
今の画面の状態から、読むべき箇所へ進んでください。
| 今の症状 | 主な原因 | 読むところ |
|---|---|---|
| #N/A と表示される | 値が見つかっていない(型の違い・余分なスペース・範囲のズレ) | 「#N/Aの原因」へ |
| #REF! と表示される | 列番号が範囲の列数を超えている | 「#REF!の原因」へ |
| #VALUE! と表示される | 列番号が1未満、または検索値が255文字超 | 「#VALUE!の原因」へ |
| #NAME? と表示される | 関数名やシート名の綴りミス、対応していない関数 | 「#NAME?の原因」へ |
| エラーは出ないが値が違う | 列の挿入・第4引数の省略・範囲の固定漏れ | 「エラーが出ない誤答」へ(最重要) |
| 1行目は合っているが、下にコピーすると崩れる | 範囲を絶対参照にしていない | 「範囲の固定漏れ」へ |
| 値の代わりに 0 が出る | 参照先のセルが空白 | 「空白セルが0になる」へ |
| 数式が文字列のまま表示される | セルの表示形式が「文字列」になっている | 「数式が計算されない」へ |
VLOOKUP関数の基本構文をおさらい
=VLOOKUP(検索値, 範囲, 列番号, 検索方法)
| 引数 | 意味 | 実務での注意点 |
|---|---|---|
| 検索値 | 探したい値 | 255文字を超えると#VALUE!になります |
| 範囲 | 検索対象のセル範囲 | 検索値は範囲の左端列になければなりません |
| 列番号 | 取り出したい列が範囲の左から何列目か | 範囲の左端が1列目。シート全体の列番号ではありません |
| 検索方法 | FALSE=完全一致/TRUE=近似一致 | 省略するとTRUE扱いになります |
特に間違えやすいのが列番号の数え方です。範囲に B2:E100 を指定した場合、B列が1列目、C列が2列目になります。B列だから2、ではありません。
また、Microsoftの公式ヘルプでも、検索値は範囲の最初の列に位置している必要があると明記されています。検索値がセルC2にある場合、範囲はC列から始める必要があります。「名前で検索して社員IDを取り出す」といった左方向への検索はVLOOKUPではできません(後述のXLOOKUPまたはINDEX+MATCHを使います)。
別シートを参照する正しい書き方
基本形
シート名と範囲を「!」でつなぎます。
=VLOOKUP(A2, Sheet2!A:B, 2, FALSE)
Sheet2のA列〜B列からA2セルの値を検索し、B列の値を取り出す式です。
たとえばSheet2に次のデータがあるとします。
| A列|社員ID | B列|名前 | C列|部署 | |
|---|---|---|---|
| 1行目 | 社員ID | 名前 | 部署 |
| 2行目 | 101 | 田中 | 営業部 |
| 3行目 | 102 | 佐藤 | 経理部 |
このとき、Sheet1に =VLOOKUP(101, Sheet2!A:B, 2, FALSE) と入力すると「田中」が返ります。
シート名にスペース・記号・数字がある場合
シート名にスペース、記号、または先頭が数字のものが含まれる場合は、シート名全体をシングルクォーテーション(’)で囲みます。
=VLOOKUP(A2, '社員 データ'!A:B, 2, FALSE) =VLOOKUP(A2, '2026年度 顧客リスト'!A:B, 2, FALSE)
囲まないとExcelがシート名の区切りを判別できず、数式を受け付けません。
いちばん確実なのは「マウスで選ぶ」
シート名を手入力する必要はありません。数式の範囲を指定する場面で対象シートのタブをクリックし、範囲をドラッグするだけで、Excelがシート名とクォーテーションを自動で正しく挿入してくれます。
シート名の入力ミスによる不具合は、この操作でほぼ全て防げます。手入力しているうちは、全角スペースや似た文字の混入といった見つけにくいミスが起こり続けます。
【最重要】エラーが出ないのに答えが間違っている3パターン
ここが本題です。エラー表示は「気づける不具合」ですが、以下の3つは気づけません。集計結果が静かに狂い、報告書が出てから発覚するのはこちらのタイプです。
パターン1|列を1本挿入しただけで、別の列の値が返る
これが最も見つけにくい誤答です。実際に検証した結果を示します。
挿入前のマスタ(A=社員ID、B=名前、C=部署)に対して、次の式を使っていたとします。
=VLOOKUP(101, マスタ!A:D, 3, FALSE) → 「営業部」(正しい)
ここで、誰かがマスタの名前と部署のあいだに「フリガナ」列を1本挿入しました。マスタはA=社員ID、B=名前、C=フリガナ、D=部署に変わります。数式は一切触っていません。
=VLOOKUP(101, マスタ!A:D, 3, FALSE) → 「タナカ」(誤り。エラーは出ない)
エラーは一切表示されません。「部署」欄にフリガナが並んでいても、パッと見では気づきにくく、そのまま印刷・提出されてしまいます。
範囲を A:D のように列全体で指定していると、列を挿入しても範囲が自動で追随してしまうため、Excelは「範囲外」とも判断せず、粛々と3列目の値を返し続けます。
対処法|列番号をMATCHで自動計算する
列番号を数字で直接書かず、見出しの文字から自動で割り出すようにします。
=VLOOKUP(101, マスタ!A:D, MATCH("部署", マスタ!$A$1:$D$1, 0), FALSE)この式は、列を挿入したあとでも「営業部」を返すことを検証済みです。MATCH関数が見出し行から「部署」の位置を毎回数え直すため、列構成が変わっても追随します。
マスタが他部署の管理下にあり、いつ列が増えるか分からない場合は、この書き方を標準にしてください。
パターン2|第4引数を省略すると、近似一致になる
第4引数を省略した =VLOOKUP(A2, マスタ!A:B, 2) は、FALSE(完全一致)ではなくTRUE(近似一致)として動作します。Microsoftのヘルプでも、完全一致を求めるならFALSEを指定するよう案内されています。
近似一致は、検索範囲の左端列が昇順に並んでいることを前提にした動作です。並んでいないマスタに対して使うと、返る値は並び順に依存し、誤った値が返るか、#N/Aになるかを予測できません(検証環境では#N/Aとなりました)。
社員IDや商品コードのように「完全に一致するものを探したい」場面では、必ずFALSEまたは0を指定してください。
=VLOOKUP(A2, マスタ!$A$2:$B$500, 2, FALSE)
なお近似一致(TRUE)が役立つのは、送料表や評価ランクのように「〇円以上〜〇円未満」の区分を判定したいケースです。この場合は左端列を昇順に並べたうえで使います。
パターン3|範囲を固定していないと、コピーした瞬間にズレる
1行目だけ正しく、下にコピーすると崩れる場合はこれです。
範囲を マスタ!A1:B5 のように書いて下方向にコピーすると、行が下がるにつれて範囲も A2:B6、A3:B7…と一緒に下がっていきます。マスタの上のほうにあるデータが検索範囲から外れていくため、途中から#N/Aになったり、値が抜けたりします。
対処は、範囲に「$」を付けて絶対参照にすることです。
誤:=VLOOKUP(A2, マスタ!A1:B5, 2, FALSE) 正:=VLOOKUP(A2, マスタ!$A$1:$B$5, 2, FALSE)
範囲を選択した状態でF4キーを押すと「$」を素早く付けられます。
また、範囲を マスタ!A:B のように列全体で指定する方法でもズレは防げます。行番号を書いていないため、コピーしても動きません。データ件数が読めないマスタではこちらが扱いやすいでしょう。
ただし列全体指定には副作用があります。前述のとおり列の挿入に対して無防備になり、また行数の多いブックでは再計算が重くなることがあります。件数が確定しているマスタは絶対参照、増減するマスタは列全体指定またはテーブル化、と使い分けるのが実務的です。
エラー別|原因と対処
#N/A|検索値が見つからない
「該当なし」を意味するエラーです。数式の書き方ではなくデータ側に原因があることがほとんどです。
原因1|データ型が違う(最頻出)
見た目は同じ「101」でも、片方が数値、もう片方が文字列だと一致しません。マスタを他システムからCSVで取り込んだ場合によく起こります。
判別方法は簡単です。セルを選択して、値が右寄せなら数値、左寄せなら文字列です(配置を手動で変更していない場合)。あるいは =ISTEXT(A2) で確認できます。
対処は、どちらかに揃えることです。
検索値が文字列、マスタが数値 → =VLOOKUP(VALUE(A2), マスタ!$A:$B, 2, FALSE) 検索値が数値、マスタが文字列 → =VLOOKUP(A2&"", マスタ!$A:$B, 2, FALSE)
いずれも検証済みで、正しい値が返ることを確認しています。ただしこれは応急処置です。恒久対策としては、マスタ側の列を「区切り位置」機能などで一括変換し、型を統一してください。
原因2|余分なスペースが入っている
末尾や先頭のスペースは画面上ほぼ見えませんが、Excelは別の値として扱います。
ここで注意していただきたい点があります。スペースが「検索値側」にあるのか「マスタ側」にあるのかで、対処が変わります。
マスタ側の値が「A001 」(末尾スペースあり)で、検索値が「A001」の場合、次の式は#N/Aのままです(検証済み)。
=VLOOKUP(TRIM(A2), マスタ!$A:$B, 2, FALSE) ← マスタ側のスペースには効かない
TRIMが処理しているのは検索値だけで、マスタ側は手つかずだからです。「TRIMを付ければ直る」という説明を見かけますが、効くのは検索値側にスペースがある場合だけです。
マスタ側にスペースがある場合は、次のいずれかで対応します。
- マスタ側を修正する(推奨):作業列にTRIMを適用し、値として貼り付け直す
- 「検索と置換」でスペースを一括削除する(全角スペースの削除も忘れずに)
- 数式側で対応する:
=INDEX(マスタ!$B:$B, MATCH(A2, TRIM(マスタ!$A$2:$A$500), 0))
最後の式はマスタ側の範囲をまとめてTRIMするため機能します(検証済み)が、範囲が大きいと計算負荷が上がります。可能な限りマスタ側を直すほうが健全です。
原因3|検索値が範囲の左端列にない
VLOOKUPは範囲の左端列しか検索できません。範囲の指定開始列が検索値の列とズレていないか確認してください。
#N/Aを画面に出したくない場合
=IFERROR(VLOOKUP(A2, マスタ!$A:$B, 2, FALSE), "データなし")
ただしIFERRORはすべてのエラーを隠します。原因を突き止める前にIFERRORで包むと、列番号の間違いなど本来直すべき不具合まで見えなくなります。先に原因を解消し、最後に体裁を整える目的で使ってください。
#REF!|列番号が範囲の列数を超えている
範囲の列数より大きい列番号を指定すると発生します。Microsoft公式でも、A列からD列の4列しかない範囲に対して5列目を要求した場合の例が挙げられています。
誤:=VLOOKUP(A2, マスタ!A:B, 3, FALSE) ← 2列しかないのに3列目を要求 正:=VLOOKUP(A2, マスタ!A:C, 3, FALSE) ← 範囲を広げる
また、参照先のシートや列を削除した直後にも発生します。この場合は削除操作を元に戻して、どの操作が原因だったかを先に特定してください。
#VALUE!|「型が違うから」ではありません
ここは、多くの解説記事が誤って説明している箇所です。
「検索値とマスタのデータ型が違うと#VALUE!になる」という説明は誤りです。型の不一致で発生するのは、前述のとおり#N/Aです。
Microsoft公式のトラブルシューティングページでは、VLOOKUPで#VALUE!が起きる原因として次の2つだけが挙げられています。
| 原因 | 対処 |
|---|---|
| 検索値が255文字を超えている | 値を短くするか、INDEX+MATCHに置き換える |
| 列番号が1未満、または文字列になっている | 列番号を1以上の数値にする |
公式ページでは、列番号の最小値は1であり、1が検索列、2がその右隣の列にあたると説明されています。
列番号にMATCH関数などを入れ子にしている場合、その関数が0を返すと#VALUE!になります。列番号を式で計算しているときは、まずその式の結果を単独のセルで確認してください。
誤:=VLOOKUP(A2, マスタ!A:C, 0, FALSE) ← 0は指定できない 正:=VLOOKUP(A2, マスタ!A:C, 2, FALSE)
#NAME?|名前として認識できない
関数名の綴りミス(VLOOKUP を VLOOKUPP など)や、シート名の指定ミスで発生します。
加えて、そのバージョンのExcelに存在しない関数を使った場合にも表示されます。XLOOKUPを含むファイルをExcel 2019以前で開くと#NAME?になるのは、このためです(次章で詳述)。
0が表示される|参照先が空白セル
VLOOKUPが取り出そうとしたセルが空白だと、空欄ではなく「0」が返ります(検証環境でも数値の0が返ることを確認しました)。マスタの入力漏れが「0」という数値に化けるため、そのまま集計すると誤解を招きます。
空欄で表示したい場合は、次のように書きます。
=IF(VLOOKUP(A2, マスタ!$A:$C, 3, FALSE)="", "", VLOOKUP(A2, マスタ!$A:$C, 3, FALSE))
ただし、本来は「なぜマスタが空白なのか」を確認するほうが先です。表示だけ整えると、入力漏れに気づく機会を失います。
数式が計算されず、文字列のまま表示される
入力したセルの表示形式が「文字列」になっていると、Excelは数式を計算せず、そのまま文字として表示します。
対処は、セルの表示形式を「標準」に戻したうえで、数式を入力し直すことです。表示形式を変えただけでは再計算されません。F2キーで編集状態にしてEnterを押し直してください。
別ブック(別ファイル)を参照する場合
別のExcelファイルを参照するときは、シート名の前にブック名を角かっこ[]で囲んで指定します。
=VLOOKUP(A2, [顧客マスタ.xlsx]Sheet1!$A:$C, 3, FALSE)
参照先のブックを閉じている状態では、フルパスを含む形に自動変換されます。
=VLOOKUP(A2, 'C:\Users\user\Documents\[顧客マスタ.xlsx]Sheet1'!$A:$C, 3, FALSE)
別ブック参照で注意すべき3点
- 参照先ファイルを移動・改名すると壊れます。フルパスで記録されるため、共有フォルダの構成変更やフォルダ名の変更で一斉にエラーになります。
- ファイルを開いたときに「リンクの更新」を求められます。更新しないままにすると、古い値が表示され続けます。
- 閉じたブックに対して使えない機能があります。Microsoftのヘルプでは、INDIRECT関数が閉じたブックを参照しようとすると#REF!になること、また動的配列関数で閉じたブックを参照した場合も同じエラーになることが示されています。あわせて、リンク先ブックに対するテーブル名・列名での構造化参照はサポートされていません。
ファイルをまたぐ参照が増えてきたら、VLOOKUPではなくPower Query(データの取得と変換)でマスタを取り込む設計に切り替えたほうが安定します。パス変更にも強く、更新も「すべて更新」で完結します。
XLOOKUPに乗り換えるべきか
VLOOKUPの弱点(左端列しか検索できない、列番号がズレる、第4引数の省略事故)を解消した後継関数がXLOOKUPです。
=XLOOKUP(A2, マスタ!$A:$A, マスタ!$C:$C, "該当なし")
列番号を数える必要がなく、検索する列と取り出す列を直接指定します。左方向の検索もでき、第4引数で「見つからない場合」の表示まで指定できるため、IFERRORで包む必要もありません。既定で完全一致になる点も安全です。
使えるバージョンを必ず確認してください
| バージョン | XLOOKUP |
|---|---|
| Microsoft 365 | 使える |
| Excel 2024 | 使える |
| Excel 2021 | 使える |
| Excel for the web | 使える |
| Excel 2019 / 2016以前 | 使えない |
Microsoft公式でも、XLOOKUPはExcel 2016および2019では使用できないと明記されています。永続ライセンス版は購入時点の機能で固定されるため、更新プログラムを適用しても後から追加されることはありません。
判断の目安
- 自分と自部署だけで使うファイルで、全員がMicrosoft 365またはExcel 2021以降 → XLOOKUPに移行してよい
- 社外・他部署に配布するファイル、または相手の環境が不明 → VLOOKUPのままが安全
ここは軽視できません。XLOOKUPを使ったファイルをExcel 2019の相手が開くと#NAME?エラーになり、数式そのものが機能しません。受け取った側は自力で復旧できず、「壊れたファイル」として扱われます。
環境が混在している組織では、配布用ファイルはVLOOKUP+MATCH、社内管理用はXLOOKUPという切り分けが現実的です。
なお、XLOOKUPが使えない環境で列ズレも防ぎたい場合は、INDEX+MATCHの組み合わせが有効です。この形はExcel 2016以前でも動作し、左方向の検索にも対応します。
=INDEX(マスタ!$C:$C, MATCH(A2, マスタ!$A:$A, 0))
よくある質問
マスタに同じIDが2件あるとどうなりますか
上から検索して最初に見つかった1件だけが返ります。2件目以降は無視され、エラーも出ません(検証済み)。重複を検知したい場合は、別途COUNTIFで件数を確認する列を設けてください。
=COUNTIF(マスタ!$A:$A, A2) ← 2以上ならマスタに重複あり
参照先のシート名を後から変更しても大丈夫ですか
大丈夫です。シートタブから名前を変更した場合、そのブック内の数式は自動で追従します。ただし数式内のシート名を文字列として組み立てている場合(INDIRECT関数など)は追従しません。
マスタの行が増えるたびに範囲を直すのが面倒です
マスタ範囲をテーブルに変換してください(範囲内を選択してCtrl+T)。テーブル名で参照すると、行が追加された分だけ範囲が自動で広がります。列全体指定と違い、見出し行を検索対象に含めてしまう心配もありません。
処理が重くて動作が遅くなりました
列全体指定(A:B)を大量の行で使っていると、再計算の対象が広がります。テーブル参照か、必要な行数までの絶対参照($A$2:$B$5000など)に絞ると改善する場合があります。
それでも重い場合は、そもそもVLOOKUPで処理する件数を超えている可能性があります。Power Queryでのマージ処理を検討してください。
「ファルセ」と覚えると聞きましたが
語呂で覚えるより、「第4引数は必ず書く」を習慣にするほうが確実です。省略が近似一致になるという仕様こそが事故の原因なので、FALSEかTRUEかを毎回意識的に選ぶ癖をつけてください。
まとめ|チェックリスト
別シート参照のVLOOKUPを書いたら、公開・提出の前に次の項目を確認してください。
- シート名はマウス操作で指定したか(手入力していないか)
- 範囲に「$」を付けた、または列全体で指定したか
- 第4引数のFALSEを書いたか
- 列番号を手打ちしている場合、マスタに列が挿入される可能性はないか(あるならMATCHで自動化)
- 検索値とマスタのデータ型が揃っているか(右寄せ/左寄せで確認)
- 原因を解消する前にIFERRORで包んでいないか
- 配布先のExcelバージョンを確認したか(XLOOKUPを使う場合)
VLOOKUPで本当に注意すべきなのは、赤いエラーではなくエラーを出さずに間違える挙動です。特に「列の挿入による列番号のズレ」と「第4引数の省略」は、気づかないまま数字が独り歩きします。この2点だけでも対策しておけば、別シート参照の事故はほとんど防げます。












コメント