要点 —
VLOOKUPはテーブルの左端の列を上から下へ値を探し、その右側の 列から何かを返します:=VLOOKUP(lookup_value, table, col_index_num, [range_lookup])。 動くかどうかを決める唯一の設定が第4引数です——ほぼ毎回FALSE(完全一致)を 使いましょう。省略したりTRUEにしたら? Excel は近似一致をします——これは 最初の列が昇順にソートされている必要があり、ソートされていないデータでは静かに 間違った行を返します。その設計から2つの固い制約が生まれます。VLOOKUP は 右方向にしか見られず、列番号はベタ書きの整数なので、列を挿入した瞬間に 壊れます。全バージョンで動作します。XLOOKUPは Excel 365 でこの両方の制約を解消します。
=VLOOKUP(A2, Products, 3, FALSE) ' 1列目でA2を探し、3列目を返す、完全一致
=VLOOKUP("APX-100", $E$2:$H$500, 4, FALSE) ' ドラッグするときは $ でテーブルを固定
VLOOKUP は世界でいちばん使われている検索関数ですが、人がハマるほぼすべての問題は、
その動作についての1つの事実にたどり着きます——それはテーブルを検索しているのでは
ないということ。VLOOKUP は1つの列——いちばん左——を上から下へなぞり、値を
見つけると、そこから決まった列数だけ右へ進みます。この絵さえ持てば、完全一致の罠、
「左を見られない」という壁、そして壊れる列番号は、すべて謎ではなくなります。
この記事で学べること
- 考え方の軸:VLOOKUP は最初の列だけをなぞり、それから右へ数える
- 第1のバグ:第4引数、そしてなぜそれは
FALSEでなければならないのか - 壁:VLOOKUP は左を見られない——では代わりにどうするか
- 静かな破壊者:列を挿入すると死ぬ、ベタ書きの列番号
#N/Aが本当に意味すること、そしてそれを(隠すのではなく)直す方法- 近似一致が実は正しい唯一の場面:帯(バンド)検索
考え方の軸:最初の列をなぞり、それから右へ数える
テーブルをグリッドだと思ってください。VLOOKUP は左端の列の上に指を置き、
lookup_value を見つけるまで下へ滑らせます。それが唯一検索する列です。一致に
たどり着くと、指を col_index_num 列ぶん右へ動かし、そこにあるものを読みます。
=VLOOKUP(A2, Products, 3, FALSE)
' | | | |
' | | | +-- 完全一致
' | | +------ テーブルの3列目を返す
' | +------------ テーブル(1列目が検索対象)
' +-------------------- 探す値、1列目の中にある
つまり、最初から2つのことが埋め込まれています。探す値は、渡したテーブルの
最初の列になければならないこと、そして数字の 3 は、シートのA列からではなく
その最初の列から数えられること。以下はすべて、この1つの設計の帰結です。
第1のバグ:第4引数(間違えると嘘をつく)
range_lookup は省略可能で、それがまさに罠です。省略すると Excel は既定で
TRUE——近似一致——になります:
=VLOOKUP(A2, Products, 3) ' 危険 — 既定で近似一致になる
=VLOOKUP(A2, Products, 3, TRUE) ' 同じこと、明示しただけ
=VLOOKUP(A2, Products, 3, FALSE) ' 99%の仕事で正しい — 完全一致
近似一致は、最初の列が昇順にソートされていると仮定し、検索値以下で最大の値を 持つ行を返します。ソートされていない製品リストでは、それはランダムに見える間違った 答えになります——しかもエラーも警告もありません。数式は数値を返します;ただ、 それが間違った数値なのです。この1つの省略が、世に存在するもっとも一般的な VLOOKUP の バグです。
あなたを救う習慣:特別な理由がない限り、第4引数として常に FALSE(か 0)を
打ち込むこと。完全一致は、意図した行を見つけるか、#N/A を返します——正直な
「見つからない」は、静かな間違った数値に毎回勝ります。
壁:VLOOKUPは右にしか見られない
最初の列を検索し、右へ数えるので、返す値は探す値の右側になければなりません。 製品IDを検索して、その左の列にある名前を返したい? VLOOKUP にはそれができません ——負の列番号は存在しないのです。
' テーブル:A = 名前、B = ID。IDを持っていて、名前(左)が欲しい。
=VLOOKUP(F2, A:B, ... ) ' 不可能 — 名前はIDの左、どんな列番号も効かない
これは工夫で回避する制限ではありません——INDEX + MATCH
と、のちの XLOOKUP が存在する理由そのものです。どちらも
検索と返却に独立した範囲を使うので、方向が問題でなくなります。VLOOKUP のために
列を並べ替えている自分に気づいたら、それはデータを動かす合図ではなく、ツールを
乗り換える合図です。
静かな破壊者:ベタ書きの列番号
col_index_num はリテラルの整数で、あなたが実際にどの列を意図したのかを
まったく知りません。VLOOKUP(A2, Data, 4, FALSE) と書くと、常に4列目を返します
——Data の途中に新しい列を挿入して、目的のデータが5番目の位置に押しやられた
後でさえも。数式はエラーになりません。静かに間違った列を返します。
これが、誰かがソーステーブルを編集した後で、引き継いだブックが「突然壊れる」ナンバー ワンの理由です。直し方は2つ:
' 直し方1 — MATCH に見出しで列を見つけさせ、自己調整させる
=VLOOKUP(A2, Data, MATCH("Price", Data_Headers, 0), FALSE)
' 直し方2 — INDEX/MATCH や XLOOKUP で列番号を完全に捨てる
=INDEX(Data_Price, MATCH(A2, Data_ID, 0))
VLOOKUP の中に MATCH を包むと、脆い整数が、挿入された
列にも耐える見出し検索に変わります。それは応急処置です;本当の治療は、そもそも列数を
必要としない関数です。
#N/A が本当に意味すること — そしてその直し方
VLOOKUP からの #N/A は1つのことを意味します:値が最初の列で見つからなかった。
完全一致では、たいてい次のどれかです:
- 見えない空白や文字 —
"APX-100 "は"APX-100"に一致しません。両側のキーをTRIM(迷子のノーブレークスペースにはSUBSTITUTE) でクリーニングします。 - 数値が文字列として保存されている不一致 — 検索値は文字列の
"1001"なのに、 テーブルには数値の1001が入っている(またはその逆)。決して一致しません。 上塗りせず、型を直します。 - 値が本当に最初の列にない — テーブルの開始列を正しく指しているか確認します。
生のエラーの代わりに親切なメッセージを出すには、包みます——ただしきつく包み、 見つからなかった場合だけを捉え、本物の数式ミスは捉えないようにします:
=IFERROR(VLOOKUP(A2, Products, 3, FALSE), "見つかりません")
IFERROR に手を伸ばすのは、数式が正しくなって
からだけにします。壊れた VLOOKUP をまるごと IFERROR で包むと、失敗の原因である
バグを隠してしまいます——一致すべき行にまで「見つかりません」を出荷することに
なります。
近似一致が正しい唯一の場面:帯(バンド)検索
TRUE には正当な用途があります:帯(バンド)や区分の検索——完全一致ではなく、
値が落ち込む行が欲しいとき——税率区分、歩合の段階、成績の境界、送料の重量帯など。
' 成績の帯:0->F, 60->D, 70->C, 80->B, 90->A (最初の列は昇順ソート!)
=VLOOKUP(B2, Grade_Table, 2, TRUE) ' 73 -> 70の帯に落ちる -> "C"
ここでは近似一致が、まさにあなたの望むことをしています:スコアを超えない最大の
しきい値を見つける。譲れない条件は、最初の列が昇順にソートされていること
——さもなければ、先ほどのソートされていないデータでの静かな失敗に陥ります。これが、
FALSE を外すことがバグではなく機能である唯一のシナリオです。
判断:VLOOKUPか、もっと新しいものか?
VLOOKUP は、単純なケース——完全一致、返す値は右側、列は動かない——には問題なく、 どこにでもあります。次のときは、その先に手を伸ばします:
- 左を見る必要がある、あるいはどちらの方向にも検索・返却したい →
INDEX+MATCHかXLOOKUP。 - ソーステーブルの列が編集される → 列番号をベタ書きしないもの。
- 組み込みの「見つからない」値が欲しい、または複数条件で一致させたい →
XLOOKUP。
VLOOKUP は間違ってはいません;ただ、今はもっと良い道具が入っている引き出しの中で いちばん古い道具なだけです。その3つの弱点——第4引数、右方向だけの壁、そして脆い 列番号——を知ることが、安全に使い、かついつやめるべきかを見極めることにつながります。
ExcelMaster の使いどころ
「VLOOKUP がおかしい」という報告のほとんどは、数式の構文の問題ではありません——
第4引数が既定で近似になっている、検索値が片側では文字列で片側では数値になっている、
あるいは編集後に列番号がずれた、というものです。ExcelMaster は完全一致を
固定した検索を書き、あなたの #N/A を起こしている型の不一致を見抜き——そして
レイアウトが左検索や、変わり続けるテーブルを要求するなら——VLOOKUP に本来向いていない
仕事を無理強いするのではなく、INDEX/MATCH か
XLOOKUP に手を伸ばします。
よくある質問
ExcelでVLOOKUPを使うには?
=VLOOKUP(lookup_value, table_array, col_index_num, FALSE)。探す値を第1引数に、
その値を最初の列に含むテーブルを第2引数に、返す列番号(テーブルの最初の列から
数える)を第3引数に、完全一致のための FALSE を第4引数に置きます。例:
=VLOOKUP(A2, Products, 3, FALSE) は Products の最初の列で A2 を見つけ、
3列目を返します。
VLOOKUPが#N/Aを返すのはなぜ?
#N/A は、値がテーブルの最初の列で見つからなかったことを意味します。よくある原因は、
見えない空白(TRIM でクリーニング)、検索値とテーブルの間の数値が文字列として保存
されている不一致、あるいは値が単に最初の列にないことです。IFERROR で隠すのではなく、
根本原因を直しましょう。
VLOOKUPの第4引数は何をする?
一致の種類を設定します。FALSE(か 0)は完全一致——ほぼ常にこれを使います。
TRUE(か省略)は近似一致で、最初の列が昇順にソートされている必要があり、
検索値以下で最大の値を返します。近似一致が正しいのは、税率区分や成績の境界のような
帯(バンド)検索だけです。
VLOOKUPは左を見られる?
いいえ。VLOOKUP は左端の列を検索し、その右側の列しか返せません。値を検索して左側に
あるものを返すには、どちらの方向も扱える
INDEX/MATCH か
XLOOKUP を使います。
列を挿入したらVLOOKUPが壊れたのはなぜ?
col_index_num が固定の数字だからです。テーブルに列を挿入すると目的のデータがずれ
ますが、数字は依然として古い位置を指しています。リテラルの数字の代わりに
MATCH("見出し", …, 0) を使って自己調整させるか、列を数えない INDEX/MATCH か
XLOOKUP に切り替えます。
検証環境
検証環境: Excel 365(Windows 11)— 最終確認 2026-07-05。
関連ガイド: ExcelのINDEX & MATCH · ExcelのHLOOKUP & LOOKUP · XLOOKUP(2025) · ExcelのIFERROR関数 · ExcelのFILTER関数
