VLOOKUP関数の使い方を、商品コードから単価を引く例で順に説明します。受注表に商品コードだけを入れ、別の一覧を見ながら商品名と単価を手で打つ作業は、この関数を使えば省けます。4つの引数の意味、FALSE と TRUE の違い、#N/A などのエラーが出たときの直し方、別のシートや別のファイルから引く書き方まで、Microsoft と Google のヘルプで確かめた内容をもとにまとめました。
VLOOKUP は、表のいちばん左の列から値を探し、見つかった行の指定した列の値を返す関数です。書き方は =VLOOKUP(検索値, 範囲, 列番号, 検索方法) で、商品コードから単価を引くなら =VLOOKUP(E2, $A$2:$C$6, 3, FALSE) のようになります。列番号は範囲の左端を1として数え、範囲は $ を付けて固定しておくと下の行へコピーしてもずれません。4つ目の検索方法には完全一致の FALSE を書きます。省略すると近似一致の TRUE として動き、違う行の値が返ることがあります。#N/A が出たら、探す値が表にあるか、余分なスペースや数値と文字列の違いがないかを確かめてください。
この記事の調べ方
2026年10月19日に、Microsoft サポートの VLOOKUP、IFERROR、TRIM、XLOOKUP などの日本語ページと、Google ドキュメント エディタ ヘルプの VLOOKUP と IMPORTRANGE のページを確認して書きました。例に使う商品の表は架空のものです。
VLOOKUP関数でできること
VLOOKUP(ブイルックアップ)の V は Vertical(垂直)の頭文字で、表を縦の方向に探す関数です。Microsoft のヘルプは、使いどころを「テーブルまたは範囲の内容を行ごとに検索する場合」と説明し、部品番号から価格を探す例と、従業員 ID から従業員名を探す例を挙げています。会社の表に置き換えると、次のような場面です。
- 見積書や発注書に商品コードを入れると、商品名と単価が入ります。
- 勤怠表や給与の一覧に社員番号を入れると、氏名と部署が入ります。
- 仕訳の入力表に科目コードを入れると、勘定科目の名前が入ります。
- 請求の明細に顧客コードを入れると、顧客名と担当者名が入ります。
どの場面も、手元の表にはコードや番号があり、そのコードの詳しい情報は別の一覧に入っています。この一覧をと呼びます。VLOOKUP はコードを手がかりにマスターから値を取り出し、2つの表をつなぎます。
手で転記していると、100行の受注には100回、一覧を開いて探してコピーする作業が要ります。VLOOKUP なら、1行目に数式を書いて下の行へコピーすれば済みます。マスターの単価を直すと、数式で引いた単価もすべて新しい値に変わります。手で打つのはコードだけなので、入力ミスに気をつける箇所も1か所になります。
VLOOKUPの使い方は、4つの引数を決めること
VLOOKUP の書き方は次のとおりです。かっこの中に、カンマで区切って4つの値(引数)を入れます。
=VLOOKUP(検索値, 範囲, 列番号, 検索方法)| 引数 | 何を入れるか | この記事の例 |
|---|---|---|
| 検索値 | 探したい値。ふつうはセルを指定する | E2(商品コード A003) |
| 範囲 | 探す表。検索値の列がいちばん左に来るように選ぶ | $A$2:$C$6 |
| 列番号 | 返したい値が、範囲の左端から何列目にあるか | 3(単価の列) |
| 検索方法 | FALSE なら完全一致、TRUE なら近似一致 | FALSE |
表の4つを、実際の商品マスターに当てはめたのが次の図です。

図では、E2 に入れた A003 を範囲の1列目(A列)から探し、見つかったシートの4行目で、範囲の3列目にある 5,800 を F2 に返しています。Microsoft のヘルプは、検索値について「セル範囲の最初の列になければなりません」と書いています。商品名で探したいなら、範囲は商品名の列から始めます。
列番号は、シートの列記号とは関係なく、選んだ範囲の左端を1として数えます。範囲が $A$2:$C$6 なら A列が1、B列が2、C列が3です。同じ表が D列から F列にあり、範囲を $D$2:$F$6 にしたときは、D列が1、E列が2、F列が3になります。
4つ目の検索方法は省略できますが、省略すると TRUE(近似一致)として動くとヘルプに書かれています。商品コードや社員番号を探すときは、毎回 FALSE を書いてください。FALSE の代わりに 0 と書いても同じ意味です。
商品コードから単価を引く手順
次の商品マスターを例に入力してみます。A1 から C6 に、商品コード、商品名、単価を入れた表です。1行目は見出しで、データは2行目から6行目にあります。
| 行 | A列 商品コード | B列 商品名 | C列 単価 |
|---|---|---|---|
| 1 | 商品コード | 商品名 | 単価 |
| 2 | A001 | マウス | 1,200 |
| 3 | A002 | モニター | 32,000 |
| 4 | A003 | キーボード | 5,800 |
| 5 | A004 | USBハブ | 2,500 |
| 6 | A005 | Webカメラ | 8,900 |
この表の横の E2 に商品コードを入れ、F2 に単価を出します。
- E1 に「商品コード」、F1 に「単価」と入力し、E2 に探したい商品コード A003 を入力します。
- F2 を選び、「=VLOOKUP(」と入力してから E2 をクリックし、カンマを入力します。
- A2 から C6 までをドラッグして範囲を選び、F4 キーを1回押して $A$2:$C$6 にします。続けてカンマを入力します。
- 単価は範囲の3列目なので 3 と入力し、カンマのあとに FALSE と入力して、かっこを閉じます。
- Enter キーを押すと、F2 に 5,800 と表示されます。
手順のとおりに入れると、F2 の数式は次のようになります。商品名を出したいときは、列番号を 2 に変えるだけです。
=VLOOKUP(E2, $A$2:$C$6, 3, FALSE)
=VLOOKUP(E2, $A$2:$C$6, 2, FALSE)1つ目の式を F2 に入れたまま E2 を A005 に書き換えると、F2 は 8,900 に変わります。範囲に見出しの1行目を含めても、FALSE で探す限り、見出しの「商品コード」と同じコードはないので結果は変わりません。この記事では、どこまでがデータかを見分けやすいよう、範囲を2行目から始めています。
検索方法 FALSE と TRUE の違い
4つ目の引数で、VLOOKUP の探し方が変わります。FALSE は、検索値とまったく同じ値がある行だけを使います。TRUE は、左端の列が小さい順に並んでいるものとして、検索値以下で最も大きい値の行を使います。Google のヘルプは TRUE の動きを、検索値より大きい値が見つかるまで下へ探し、見つかったらその前の行で止まる、と説明しています。

図の右側は、数量に応じた割引率の表です。注文が30個なら、30以下で最も大きい「10」の行の5%が返ります。このように、金額や数量の帯ごとに率や区分を決める表には TRUE が向いています。
| H列 数量(以上) | I列 割引率 |
|---|---|
| 0 | 0% |
| 10 | 5% |
| 50 | 10% |
| 100 | 15% |
この表が H2 から I5 にあり、D2 に数量が入っているとき、割引率は次の式で求められます。
=VLOOKUP(D2, $H$2:$I$5, 2, TRUE)この式は、D2 の数量を H列から探し、2列目の割引率を返します。TRUE を使うときは、左端の列を小さい順(昇順)に並べておきます。並んでいない表で TRUE を使うと、エラーにならずに違う行の値が返ることがあると、Microsoft と Google の両方のヘルプが書いています。また、検索値が左端の列の最小値より小さいと #N/A になります。上の表に0の行を入れているのはそのためです。
コードや番号を探すときは FALSE を使います。数値の範囲から区分を引くときは、小さい順に並べた表で TRUE を使います。区分が2つか3つだけなら、表を作らずにIF関数の入れ子で書く方法もあります。
数式を下の行にコピーするときは、範囲を$で固定する
数式を下の行にコピーすると、範囲がずれることがあります。たとえば F2 に =VLOOKUP(E2, A2:C6, 3, FALSE) と書いて F3 にコピーすると、数式は =VLOOKUP(E3, A3:C7, 3, FALSE) に変わります。範囲から2行目が外れるので、E3 に A001 を入れても見つからず、#N/A になります。
F2 に書いた式 =VLOOKUP(E2, A2:C6, 3, FALSE)
F3 にコピーした式 =VLOOKUP(E3, A3:C7, 3, FALSE) ← 範囲も1行ずれる
$ を付けた式 =VLOOKUP(E2, $A$2:$C$6, 3, FALSE)
F3 にコピーした式 =VLOOKUP(E3, $A$2:$C$6, 3, FALSE) ← 範囲は変わらない列と行の前に $ を付けると、コピーしても参照先が変わらないになります。Microsoft のヘルプも、範囲に絶対参照を使うと「数式を下方向へコピーした場合に常にまったく同じ検索範囲を参照することができます」と勧めています。範囲を選んだ直後に F4 キーを押すと、$A$2:$C$6 の形になります。数式バーで参照を選んで F4 キーを続けて押すと、$A$2、A$2、$A2、A2 の順に、列と行のどちらを固定するかが切り替わります(ヘルプ)。
範囲を固定したら、次の手順で下の行へコピーします。
- 数式を入れた F2 を選びます。
- セルの右下の小さな四角(フィル ハンドル)にマウスを合わせ、ポインターが十字になったら下へドラッグします。
- コピーした行で、検索値のセルだけが E3、E4 と変わり、範囲が $A$2:$C$6 のままかを数式バーで確かめます。
「1行目は合っているのに、下の行で #N/A が出る」「途中の行から結果がおかしい」という場合は、ほとんどがこのずれです。数式バーで範囲に $ が付いているかを見てください。F4 キーなど Excel の作業を速くするキーは、Excelショートカットキーの記事にまとめています。
マスターに商品が増えていく場合は、範囲を $A:$C のように列全体で指定する書き方もあります。行の終わりを気にせず追加でき、Microsoft のヘルプにも列全体を指定した例が載っています。
別シート・別のブックの表から引く
実務では、商品マスターを入力用のシートとは別のシートに置くことがよくあります。別のシートの表を範囲にするときは、範囲の前に「シート名!」を付けます。「商品マスター」というシートの A列から C列を探すなら、次のように書きます。
=VLOOKUP(B2, 商品マスター!$A:$C, 2, FALSE)この式は、B2 に入れた商品コードを「商品マスター」シートの A列から探し、2列目の商品名を返します。シート名に空白が入っている場合は、シート名をシングルクォーテーションで囲みます。Microsoft のヘルプには =VLOOKUP(A2,'Client Details'!A:F,3,FALSE) という例があります。数式を入力している途中で別のシートを開き、範囲をドラッグで選べば、この形は Excel が自動で入れてくれるので、手で打つより確実です。
別のブック(ファイル)の表から引く
別のファイルにあるマスターも範囲にできます。Microsoft のブック リンクのヘルプによると、参照先のブックを開いているときは、角かっこで囲んだブック名、シート名、!、セル範囲の順に表示されます。master.xlsx というブックの Sheet1 を探す場合は次の形です。
=VLOOKUP(B2, [master.xlsx]Sheet1!$A$2:$C$100, 2, FALSE)ブック名やシート名に空白や英字以外の文字が入っているときは、'[商品 マスター.xlsx]Sheet1'!$A$2:$C$100 のように名前を ' で囲む、とヘルプにあります。範囲をドラッグで選べば Excel がこの記号も自動で付けるので、入った形のまま使ってください。
参照先のブックを閉じると、数式にはファイルの場所(フォルダーのパス)が自動で付きます。マスターのファイルの名前や置き場所を変えると、数式の参照先を直す必要が出てきます。共有フォルダーのマスターを何人もの表から参照するなら、置き場所とファイル名を決めておいてください。毎月届く明細とマスターを突き合わせる作業なら、Power Query の記事で扱っているマージ(表の結合)のほうが、数式を毎回コピーせずに済みます。
VLOOKUPがエラーになるときの原因と直し方
VLOOKUP が思いどおりに動かないとき、表示された記号から原因をかなり絞れます。Microsoft のヘルプに書かれている原因と直し方を、表示ごとにまとめました。

図の4つの表示のうち、#N/A は原因がいくつもあるので、先に詳しく見ていきます。
#N/A は、探した値が見つからないとき
#N/A は、検索値と一致する値が範囲の1列目にないときに表示されます。表に登録されていないコードを探した場合は、マスターに追加するか、次の節の IFERROR で表示を変えます。困るのは、表にあるはずの値で #N/A が出る場合です。見た目は同じでも、Excel は次のような違いを別の値として扱います。
- 末尾や先頭のスペース。「A003 」のように後ろに空白が入っていると一致しません。前後のスペースは TRIM 関数 で消せます。ヘルプは TRIM を半角のスペース(値 32)を消すための関数と説明しているので、全角のスペースが残るときは[検索と置換]で全角スペースを空欄に置き換えます。
- 全角と半角の違い。「A003」と「A003」は別の値です。ASC 関数で全角の英数字を半角に変えられます。カタカナも半角になるので、検索値とマスターの両方に同じ変換をかけてください。
- 数値と文字列の違い。マスターの商品コード 1001 が文字列として保存され、検索値が数値の 1001 だと一致しません(#N/A のヘルプ)。
- 検索方法を TRUE にしている、または省略している。並んでいない表では #N/A や違う値が返ります。
スペースが原因なら、検索値を TRIM で囲むと直ります。全角と半角が混ざっているなら ASC を重ねます。マスター側に空白が混ざっている場合は、検索値だけ直しても一致しません。マスターの列そのものを[検索と置換]で整えるか、TRIM をかけた補助の列を作ってそこを探します。
=VLOOKUP(TRIM(E2), $A$2:$C$6, 3, FALSE)
=VLOOKUP(TRIM(ASC(E2)), $A$2:$C$6, 3, FALSE)上の2つの式は、検索値の空白を消し、全角の英数字を半角にしてから探すので、これらの違いによる #N/A を防げます。数値と文字列の違いは、ほかのシステムから書き出した CSV を貼り付けたときによく起きます。文字列として保存された数値のセルには左上に緑色の三角形が出るので、セルを選んで警告のアイコン(Alt + Shift + F10)から[数値に変換]を選びます。数式で直すなら VALUE 関数で数値に変えます(ヘルプ)。001 のように先頭に0が付くコードは文字列のまま使うことが多いので、その場合は検索値の側も文字列にそろえます。
#REF! と #VALUE! は、列番号を見直す
#REF! は、列番号が範囲の列数より大きいときに表示されます。範囲が $A$2:$C$6 の3列なのに列番号を 4 にした、という場合です。返したい列が範囲に入っていないので、範囲を広げるか列番号を直します。
#VALUE! は、列番号が1より小さいときや、列番号に文字が入っているときに表示されます。#VALUE! のヘルプには、検索値が255文字を超えている場合も原因として挙がっていて、値を短くするか、INDEX と MATCH を組み合わせる方法が案内されています。
エラーは出ないのに、違う値が返る
エラーより気づきにくいのが、もっともらしい別の値が返るケースです。よくある原因は3つです。1つ目は検索方法が TRUE か省略になっている場合で、FALSE を書けば直ります。2つ目はコピーで範囲がずれている場合で、範囲に $ を付けて直します。3つ目はマスターに同じコードが2行ある場合です。VLOOKUP が返す値は1つだけです。Google スプレッドシートのヘルプには、最初に一致した行の値が返ると書かれています。下の行に新しい単価を足した、という場合は古い単価が出続けるので、コードの重複がないかも確かめてください。
そもそも検索値の入力ミスを減らしたい場合は、コードを入れるセルにプルダウンを付けておくと、マスターにないコードを入れられなくなります。作り方はデータの入力規則の記事にまとめています。
IFERRORで #N/A を「未登録」や空白に置き換える
商品コードをまだ入れていない行や、マスターにない新商品の行には #N/A が並びます。社外に出す見積書や、上司に回す集計表では見た目もよくありません。Microsoft のヘルプは、こうした場合に IFERROR でエラー時の表示を指定する方法を案内しています。書き方は IFERROR(値, エラーの場合の値) です(ヘルプ)。VLOOKUP を丸ごと1つ目に入れます。
=IFERROR(VLOOKUP(E2, $A$2:$C$6, 2, FALSE), "未登録")2つ目の引数に何を入れるかは、その列の使い道で決めます。よく使う4通りを並べました。
| 2つ目の引数 | エラーのときの表示 | 向いている列 |
|---|---|---|
| "該当なし" | 該当なし | 社外に出す帳票で、データがないことをはっきり示したい列 |
| "" | 空欄 | コードをまだ入れていない行が多く、見た目をすっきりさせたい列 |
| 0 | 0 | 金額や数量の列。合計の欄がエラーになるのを防ぐ |
| "未登録" | 未登録 | マスターに未登録の新商品や新しい取引先を見つけたい列 |
表の 0 の行は、金額の列のための書き方です。金額の列にエラーが1つでも残ると、その列を足した合計の欄もエラーになります。合計を取る列は 0 を返しておくと、エラーが合計まで広がりません。
IFERROR には弱点もあります。#N/A のほかに、列番号の間違いで出る #REF! や #VALUE! も同じように「未登録」へ置き換えてしまいます。数式を作った直後は IFERROR を付けずに数行で結果を確かめ、正しく動くと分かってから囲むと、設定の誤りを見逃さずに済みます。
受注表に商品名と単価を自動で入れる例
営業事務の受注表で使う例です。毎日20件から30件の受注を入力していて、そのたびに商品マスターを開いて商品名と単価を確かめている、という場面を想定します。「マスター」シートの A列に商品コード、B列に商品名、C列に単価を入れ、「受注」シートに次の列を作ります。
| 列 | 内容 | 入れ方 |
|---|---|---|
| A列 | 受注日 | 手入力 |
| B列 | 商品コード | 手入力 |
| C列 | 商品名 | =IFERROR(VLOOKUP(B2, マスター!$A:$C, 2, FALSE), "未登録") |
| D列 | 数量 | 手入力 |
| E列 | 単価 | =IFERROR(VLOOKUP(B2, マスター!$A:$C, 3, FALSE), 0) |
| F列 | 金額 | =D2*E2 |
表のとおりに作ると、手で入れるのは受注日、商品コード、数量の3列で、商品名、単価、金額の3列は数式で埋まります。6列を全部手で打っていた場合と比べて、入力する列は半分です。
商品名は、マスターにないコードのときに「未登録」と出るようにしています。新商品の登録漏れに、受注を入れた時点で気づけます。単価はエラーのときに 0 を返すので、金額も 0 になり、確認の要る行が目立ちます。
1つ気をつけたいのは、マスターの単価を改定すると、過去の受注の行も新しい単価で計算し直される点です。締めた月の金額を残したい場合は、月末に受注の行をコピーし、[値の貼り付け]で数式を値に置き換えてから次の月に進んでください。
VLOOKUPの限界と、XLOOKUP・INDEX+MATCHに切り替えるとき
VLOOKUP は Excel 2016 や Excel 2019 を含む古いバージョンでも使えるので、取引先とファイルをやり取りする表にも使いやすい関数です。ただし、次のような制約があります。
- 検索値の列より左にある値は取り出せません。範囲のいちばん左の列でしか探せないためです。
- マスターに列を挿入すると、列番号が指す列がずれます。列番号は数字で固定されているので、数式を直す必要があります。
- 条件を2つ以上組み合わせて探せません。Google のヘルプでは、& で列をつないだ補助の列を作る方法が案内されています。
- 検索値が255文字を超えると #VALUE! になります。
Microsoft のヘルプは、VLOOKUP のページの冒頭で XLOOKUP を VLOOKUP の改良にあたる関数として紹介し、どの方向にも探せて、既定で完全一致を返すと説明しています。ただしXLOOKUP のヘルプには「XLOOKUP は Excel 2016 および Excel 2019 では使用できません」とあります。同じページの対象には、Microsoft 365、Excel 2021、Excel 2024 などが並んでいます。社内や取引先に古い Excel が残っているなら、VLOOKUP か INDEX と MATCH の組み合わせを使うほうが無難です。
VLOOKUP と XLOOKUP の違い、XLOOKUP への置き換え方、INDEX と MATCH との比較は、XLOOKUP関数の記事で詳しく扱っています。左にある列を返したい、列の挿入で数式が壊れるのを避けたい、という場面が出てきたら、そちらを読んでみてください。
GoogleスプレッドシートのVLOOKUPも書き方は同じ
Google スプレッドシートの VLOOKUP も、=VLOOKUP(検索キー, 範囲, 番号, [並べ替え済み]) と同じ順に4つの値を入れます。Google のヘルプによると、4つ目を省略すると TRUE(近似照合)として動き、完全一致には FALSE がおすすめとされています。近似照合を使う前に昇順に並べる点も Excel と同じです。Excel で書いた VLOOKUP は、ほぼそのままの形で使えます。
違いが出るのは、別のファイルから引くときです。スプレッドシートには、別のファイルの範囲を読み込む IMPORTRANGE 関数があります。IMPORTRANGE のヘルプによると、初めて読み込むときは #REF! が表示され、[アクセスを許可]を押すと読み込めるようになります。この関数で読み込んだ範囲を VLOOKUP の範囲に入れると、別のファイルのマスターから引けます。ヘルプに2つを組み合わせた例はないので、次の式は2つの関数の書き方を組み合わせたものです。
=VLOOKUP(A2, IMPORTRANGE("スプレッドシートのURL", "シート1!A:C"), 2, FALSE)この式では、IMPORTRANGE で読み込んだ別のファイルの A列から C列が、VLOOKUP の範囲になります。アクセスの許可は、IMPORTRANGE を単独で入れたセルで済ませてから VLOOKUP と組み合わせると、どこで止まっているかが分かりやすくなります。
見つからないときの表示を変えるには、IFERROR のほかに、#N/A だけを置き換える IFNA も使えます。IFNA は Excel にもある関数です(ヘルプ)。Google のヘルプでは =IFNA(VLOOKUP(G3, B4:D8, 3, FALSE),"NOT FOUND") という例が紹介されています。#REF! などほかのエラーはそのまま見えるので、設定の誤りに気づきやすくなります。
よくある質問
範囲は A:C のように列全体で指定してもよいですか
指定できます。Microsoft のヘルプにも列全体を範囲にした例があります。マスターに行を足しても範囲を直さずに済むので、商品が増えていく表に向いています。同じ列の下のほうに別の表やメモを置かないようにしてください。
#SPILL! と表示されました
新しい Excel で、検索値に1つのセルの代わりに A:A のような列全体を指定すると #SPILL! が出ることがあります。Microsoft のヘルプは、検索値を A2 のような1つのセルにするか、@A:A のように @ を付けて直す方法を案内しています。
数式を消して、結果の値だけ残せますか
結果のセルをコピーし、同じ場所に[値の貼り付け]をすると、数式が値に置き換わります。マスターを更新しても結果は変わらなくなるので、締めた月の受注表や、社外に送るファイルに向いています。
1つの数式で、商品名と単価をまとめて返せますか
VLOOKUP の1つの数式が返すのは1つの値です。Google スプレッドシートのヘルプにも「各 VLOOKUP 関数が返す値は 1 つのみです」とあります。商品名と単価が両方要るなら、列番号を 2 と 3 にした数式を2つ並べます。複数の列をまとめて返す方法は、XLOOKUP関数の記事の「複数列の結果を一括取得する」で扱っています。
VLOOKUP で迷ったら、まず4つの引数を図の表に当てはめてみてください。範囲は検索値の列から始めて $ で固定し、列番号は範囲の左端から数え、4つ目は FALSE と書きます。この3点を確かめても #N/A が出る場合は、データのスペースや、数値と文字列の違いが原因のことがよくあります。
社内の表を題材にした Excel 研修を行っています
VLOOKUP や IF などの関数から、ピボットテーブル、Power Query まで、受講する方の業務に近い表を使って練習する Excel 研修です。受注表や勤怠表の転記を減らしたい、関数を使える人を社内に増やしたい、という段階からご相談いただけます。