Menu

VLOOKUP関数の使い方: Excelの数式、例、#N/Aの直し方

=VLOOKUP(F2,A2:D6,3,FALSE)はA2:D6の最初の列でF2を探し、同じ行の3列目の値を返します。完全一致と近似一致、#N/Aの直し方、別シートからの検索、2つの条件での検索を学びます。

このページのシートはすべて実際に動きます。数値や数式を変えると再計算されます。

=VLOOKUP(F2,A2:D6,3,FALSE)は、A2:D6の最初の列でF2の値を探し、同じ行の3列目の値を返します。最後のFALSEは「完全一致のみ」という意味です。F2で別の商品を選ぶと、価格が変わります。

商品の価格
G2
ABCDEFG
1ProductCategoryPriceStockLook forPrice
2AppleFruit$1.2040Pear$1.50
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

G2をクリックすると、表A2:D6が枠で示されます。数式の3を2に変えると、G2は価格の代わりにカテゴリーを返します。Categoryが表の2列目だからです。一致は大文字と小文字を区別しないので、pearでもPearが見つかります。

VLOOKUP関数の構文

=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
引数内容この例では
lookup_value(検索値)探す値。F2(Pear)
table_array(範囲)探す表。VLOOKUPはその最初の列だけを探します。A2:D6
col_index_num(列番号)表の何列目を返すか。表の最初の列を1として数えます。3(Price)
range_lookup(検索方法)完全一致ならFALSEか0。近似一致ならTRUE、1、または省略。FALSE

列番号は、シートのA列からではなく表の始まりから数えます。C列から始まる表では、col_index_numの2はD列を意味します。表の幅より大きい数は#REF!を、0は#VALUE!を返します。

小数点にカンマを使う言語に設定されたExcelでは、引数をセミコロンで区切ります:=VLOOKUP(F2;A2:D6;3;FALSE)。

MATCHで返す列を選ぶ

3を直接書いておくと、誰かが表の中に列を挿入したときに気づかないまま壊れます。数式は3列目を返し続けますが、そこには別のものが入っているからです。代わりにMATCHで見出しから列番号を探させます。ここではG1がドロップダウンリスト(プルダウン)になっていて、StockかCategoryを選ぶとG2もそれに合わせて変わります。

見出しから列番号を求める
G2
ABCDEFG
1ProductCategoryPriceStockLook forPrice
2AppleFruit$1.2040Carrot0.8
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

MATCH(G1,A1:D1,0)は見出し行での「Price」の位置3を返し、VLOOKUPはそれを列番号として使います。Carrotなら0.8です。これは行を商品で、列を見出しで選ぶ2方向の検索です。VLOOKUPの代わりにINDEXで同じ考え方を書く方法は、INDEXとMATCHのページにあります。

近似一致: TRUEを指定したVLOOKUP

最後の引数をTRUEにすると、VLOOKUPは等しい値を探しません。検索値以下の最大の値を探します。税率の区分、成績、送料、手数料の段階のような区分にはこれが必要です。最初の列は小さい順に並べておく必要があります。

売上に応じた手数料率
F2
ABCDEF
1Sales fromRateRepSalesRate
200%Ana7500%
310003%Ben4,2003%
450005%Cara5,0005%
5100008%Dev12,5008%
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

Benの4,200はA列にありません。それを超えない最大の値は1,000なので、Benは3%です。Caraの5,000は5,000の行と完全に一致するので5%です。Devの12,500は最後の区分を超えているので、最後の率の8%になります。最初の区分より小さい値(ここではマイナスの売上)は#N/Aを返すので、表は0から始めています。

$A$2:$B$5の$記号は、F2をF5まで下にコピーしても表を固定します。$がないと、F3はA3:B6を探して最初の区分を飛ばしてしまいます。

4つ目の引数を省略するとTRUEと同じになります。並べ替えていない商品リストでは、これが気づかないバグになります。Excelはリストが並んでいるものとして探すので、違う行の価格を返したり、ある値に#N/Aを返したりします。名前、コード、IDを検索するときは、必ず最後にFALSEを付けてください。

VLOOKUPが#N/Aを返す理由

#N/Aは「見つからない」という意味です。下のシートはよくある原因を3つ示していて、G列ではそれぞれの検索をIFNAとTRIMで囲んでいます。

#N/Aを返す3つの検索
F2
ABCDEFG
1ProductCategoryPriceStockLook forPriceFixed
2AppleFruit$1.2040Kiwi#N/ANot found
3PearFruit$1.5025Milk #N/A$1.10
4CarrotVegetable$0.8060Fruit#N/ANot found
5BreadBakery$2.4015
6MilkDairy$1.1030
#N/A 探している値が検索範囲にありません。
  1. 値が表にない。 KiwiはA2:A6にありません。これは本当の「見つからない」で、IFNA(...,"Not found")で読める文字列に変えられます。E2をAppleに変えると、両方の列に価格が表示されます。
  2. 余分なスペース。 E3には末尾にスペースの付いた"Milk "が入っているので、Milkと等しくなりません。TRIM(E3)でスペースを取り除けば、G3で価格が見つかります。スペースが表のほうにあるなら、検索ごとにTRIMを使うのではなく、A列をTRIMで一度きれいにしてください。
  3. 値が別の列にある。 Fruitはありますが、B列にあります。VLOOKUPは表の最初の列しか探さないので、E4は両方の列で失敗します。表を探す列から始めるか、探す列と返す列を別々に指定するXLOOKUPを使ってください。

検索を囲むならIFERRORではなくIFNAを使います。IFNAは#N/Aだけを受け止めるので、列番号の間違いによる#REF!は「Not found」として隠されず、そのまま表示されます。

ほかにも原因が2つあります:

  • 文字列として保存された数値。 A列の商品コードが文字列として入力されていて(取り込んだ後によくあり、隅に小さな緑色の三角形が付きます)、F2に数値の101が入っていると、101がリストにあっても=VLOOKUP(F2,A2:B6,2,FALSE)は#N/Aを返します。どちらかを変換してください。=VLOOKUP(F2&"",A2:B6,2,FALSE)は文字列の「101」を探し、F2が文字列なら=VLOOKUP(VALUE(F2),A2:B6,2,FALSE)で数値を探せます。
  • 並べ替えていないデータでの近似一致。 上の節で説明したとおりです。

VLOOKUPが空白ではなく0を返す

VLOOKUPが行き着いたセルが空だと、Excelは空のセルではなく0を表示します。すると在庫が入力されていないだけなのに、Stock列の0が「在庫切れ」と読まれてしまいます。数式に&""を付けるか、結果の長さを判定します:

=VLOOKUP(F2,A2:D6,4,FALSE)&""
=IF(LEN(VLOOKUP(F2,A2:D6,4,FALSE))=0,"",VLOOKUP(F2,A2:D6,4,FALSE))

1つ目は短いですが、返す数値をすべて文字列に変えてしまうので、後のSUMで飛ばされます。2つ目は数値を数値のまま保ちます。

別シートからVLOOKUPする

表の前にシート名と!を書きます。Excelで数式を作るときは、別のシートのタブをクリックして範囲を選択すれば、ExcelがPrices!A2:B6と書いてくれます。ここではOrdersタブがPricesタブの価格を検索しています。

Pricesシートから価格を付けた注文
D2
ABCDE
1OrderProductQtyPriceTotal
21001Pear3$1.50$4.50
31002Milk2$1.10$2.20
41003Apple5$1.20$6.00
51004Bread1$2.40$2.40
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

Pricesタブを開いてAppleの価格を変えると、注文の合計が更新されます。注意点が2つあります:

  • スペースを含むシート名は単一引用符で囲みます:=VLOOKUP(B2,'Price list'!$A$2:$B$6,2,FALSE)。
  • 別のブックの表には、角かっこでファイル名を付けます:[Prices.xlsx]Prices!$A$2:$B$6。そのファイルを閉じると、Excelは数式にフルパスを表示し、保存されたファイルから検索を続けます。

ワイルドカードを使ったVLOOKUP(部分一致)

FALSEを指定しているとき、検索値にワイルドカードを含められます。*は任意の数の文字を、?はちょうど1文字を表します。"*"&E2&"*"は、名前にE2の文字列を含む最初の商品を見つけます。

名前の一部から商品を探す
F2
ABCDEF
1ProductCategoryPriceContainsPrice
2Green teaDrinks$3.20coffee$2.90
3Iced coffeeDrinks$2.90
4Coffee beansPantry$8.50
5Black teaDrinks$2.70
6Orange juiceDrinks$3.40
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

「coffee」はIced coffeeとCoffee beansの両方に一致し、VLOOKUPは上から最初のもの$2.90を返します。E2をbeanに変えると$8.50に、juiceにも変えてみてください。本物のアスタリスクや疑問符を探すには、前にチルダを付けます:"~*"。

左側の列をVLOOKUPで返す

VLOOKUPは、探す列より左にある列を返せません。col_index_numは右方向にしか数えられず、マイナスの数はエラーになります。価格から商品を探すには、XLOOKUPかINDEXとMATCHを使ってC列を探し、A列を返します:

=XLOOKUP(2.4, C2:C6, A2:A6)              Excel 2021 and Microsoft 365
=INDEX(A2:A6, MATCH(2.4, C2:C6, 0))      every version

どちらも最初のシートのデータでBreadを返します。詳しくはXLOOKUPで説明しています。

練習: 重さに応じた送料

送料表
E2
ABCDE
1Weight from (kg)CostWeight (kg)Cost
20$4.507
32$6.00
45$9.50
510$14.00
620$22.00
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

やってみよう: 各送料は、その重さからリストの次の重さまでに適用されます。E2で、VLOOKUPを使ってD2の荷物の重さに対する送料を返してください。

2つの条件でVLOOKUPする

VLOOKUPが受け取る検索値は1つです。2つの列で一致させるには、2つをつなげた作業列を作って表の最初に置き、同じようにつなげた文字列を検索します。下のA列は=B2&"-"&C2を下にコピーしたもので、Coffee-Small、Coffee-Largeなどが入っています。

商品とサイズで価格を出す
G2
ABCDEFG
1KeyProductSizePriceProductSizePrice
2Coffee-SmallCoffeeSmall$2.50TeaLarge
3Coffee-LargeCoffeeLarge$3.50
4Tea-SmallTeaSmall$2.00
5Tea-LargeTeaLarge$3.00
6Juice-SmallJuiceSmall$3.00
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

やってみよう: A列は商品とサイズをハイフンでつないでいます。G2で、E2の商品とF2のサイズに対応する価格を返してください。

区切り文字が大切です。"Tea"&"Large"はTeaLargeになり、A列のどれにも一致しません。Excel 2021とMicrosoft 365では、=XLOOKUP(1,(B2:B6=E2)*(C2:C6=F2),D2:D6)で作業列なしに検索できます。その方法とINDEX/MATCH版は複数条件での検索で紹介しています。

よくある質問

ExcelでVLOOKUPはどう使いますか?

=VLOOKUP(と入力し、4つの引数を指定します。探す値、表(最初の列にその値が入っている必要があります)、返す列の番号、完全一致を表すFALSEです。=VLOOKUP("Pear",A2:D6,3,FALSE)はA列でPearを探し、その行のC列の値を返します。

VLOOKUPの最後のTRUEとFALSEはどういう意味ですか?

FALSE(または0)は完全一致を求め、値がなければ#N/Aを返します。TRUE(または1、引数の省略)は近似一致を求め、検索値以下の最大の値を返します。これは最初の列が昇順に並んでいるときだけ正しく動きます。

VLOOKUPが#N/Aを返すのはなぜですか?

表の最初の列で値が見つからなかったからです。よくある原因は、打ち間違い、余分なスペース("Milk "は"Milk"と違う)、片方だけ文字列として保存された数値、別の列にある値です。数式をIFNAで囲めば、自分で決めた文字列を表示できます:=IFNA(VLOOKUP(F2,A2:D6,3,FALSE),"Not found")。

VLOOKUPで左側の列を返せますか?

できません。VLOOKUPが返せるのは、表の最初の列より右にある列だけです。Excel 2021かMicrosoft 365なら=XLOOKUP(F2,C2:C6,A2:A6)を、どのバージョンでも使えるのは=INDEX(A2:A6,MATCH(F2,C2:C6,0))です。

別シートからVLOOKUPするには?

範囲の前にシート名と感嘆符を付けます:=VLOOKUP(B2,Prices!$A$2:$B$6,2,FALSE)。シート名にスペースがあるときは単一引用符で囲みます:'Price list'!$A$2:$B$6。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める