🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

ExcelのVLOOKUP関数 — 使い方と、それを壊す第4引数

|

ExcelのVLOOKUP関数 — 使い方と、それを壊す第4引数

要点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つの事実にたどり着きます——それはテーブルを検索しているのでは ないということ。VLOOKUP1つの列——いちばん左——を上から下へなぞり、値を 見つけると、そこから決まった列数だけ右へ進みます。この絵さえ持てば、完全一致の罠、 「左を見られない」という壁、そして壊れる列番号は、すべて謎ではなくなります。

この記事で学べること

  • 考え方の軸: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 + MATCHXLOOKUP
  • ソーステーブルの列が編集される → 列番号をベタ書きしないもの。
  • 組み込みの「見つからない」値が欲しい、または複数条件で一致させたい → XLOOKUP

VLOOKUP は間違ってはいません;ただ、今はもっと良い道具が入っている引き出しの中で いちばん古い道具なだけです。その3つの弱点——第4引数、右方向だけの壁、そして脆い 列番号——を知ることが、安全に使い、かついつやめるべきかを見極めることにつながります。

ExcelMaster の使いどころ

「VLOOKUP がおかしい」という報告のほとんどは、数式の構文の問題ではありません—— 第4引数が既定で近似になっている、検索値が片側では文字列で片側では数値になっている、 あるいは編集後に列番号がずれた、というものです。ExcelMaster は完全一致を 固定した検索を書き、あなたの #N/A を起こしている型の不一致を見抜き——そして レイアウトが左検索や、変わり続けるテーブルを要求するなら——VLOOKUP に本来向いていない 仕事を無理強いするのではなく、INDEX/MATCHXLOOKUP に手を伸ばします。

よくある質問

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/MATCHXLOOKUP を使います。

列を挿入したらVLOOKUPが壊れたのはなぜ?

col_index_num が固定の数字だからです。テーブルに列を挿入すると目的のデータがずれ ますが、数字は依然として古い位置を指しています。リテラルの数字の代わりに MATCH("見出し", …, 0) を使って自己調整させるか、列を数えない INDEX/MATCHXLOOKUP に切り替えます。

検証環境

検証環境: Excel 365(Windows 11)— 最終確認 2026-07-05。

関連ガイド: ExcelのINDEX & MATCH · ExcelのHLOOKUP & LOOKUP · XLOOKUP(2025) · ExcelのIFERROR関数 · ExcelのFILTER関数