スポンサーリンク
テクノロジー

ExcelのVLOOKUPとXLOOKUP|別の表から値を引く書き方と、#N/Aになる原因の直し方

Excelで商品コードから単価を引く例を使い、VLOOKUPの4つの引数、完全一致と絶対参照、XLOOKUPへの置き換えを説明します。INDEXとMATCHの代案、#N/Aの原因を探す順番、文字列の数値や空白の確認、重複と近似一致の扱い、値に貼り付ける前の照合まで、同じ表と数式で確かめます。

カードの引き出しから一枚を探し出す手元

注文表の商品コードを見ながら、別の価格表から単価を探して入力する。数件ならできても、行が増えると探し間違いや転記漏れが気になります。VLOOKUPやXLOOKUPは、この「同じコードの行を探し、その行にある単価を返す」作業に使う関数です。

数式を入れたのに#N/Aが出る場合は、書き方だけでなく、コードの保存形式や余分な空白も確認します。ここでは架空の商品マスターと注文表を使い、基本の書き方から、見つからない原因の切り分け、結果の照合までを同じセル番地で確かめます。

スポンサーリンク

商品コードで注文表と商品マスターを結び付ける

二つの表に共通する値を決める

注文表には、何を何個注文したかを記録します。商品マスターには、商品コード、商品名、単価を登録します。マスターとは、繰り返し参照する基本情報の一覧です。注文のたびに単価を書き写す代わりに、注文表の商品コードを手がかりとしてマスターの該当行を探します。

同じ色の札を見比べて組み合わせる手元
共通の手がかりで二つの表を結ぶ

この手がかりになる値を「検索キー」と呼びます。商品名は表記が変わることがあるため、ここでは商品コードをキーにします。同じ商品に同じコードが付いていること、一つのコードに対して単価を一つに決められることが、検索を始める前の条件です。

練習では一枚のシートに次のように配置します。A~D列が注文表、F~H列が商品マスターで、E列は空けます。表の左端の「行」は場所を示すための表示なので、セルへ入力しません。単価と数量は数値として入力し、C列とD列は数式を入れるまで空欄にします。

行 A:商品コード B:数量 C:単価 D:金額 F:商品コード G:商品名 H:単価
1 商品コード 数量 単価 金額 商品コード 商品名 単価
2 P102 3 空欄 空欄 P101 メモ帳 120
3 P104 2 空欄 空欄 P102 ボールペン 180
4 P101 5 空欄 空欄 P103 クリアファイル 250
5 P999 1 空欄 空欄 P104 付箋 90

価格は説明用の架空の値です。見出しは1行目、マスターのデータは2~5行目なので、検索に使う範囲はF2:H5です。最初の注文はA2のP102を探し、F3で見つかったら、同じ行のH3にある180をC2へ返す、という流れになります。

行の順番が違っても照合できる

注文表とマスターの行順はそろっていません。A2とF2をそのまま比較するのではなく、A2をF2~F5の中から探すため、P102の注文を先に書いても構いません。完全一致の検索なら、商品コードを昇順に並べる必要もありません。

P999は、見つからない場合を試すための未登録コードです。正常な三件と未登録の一件を一緒に用意すると、「何か数値が出た」だけで判断せず、検索に成功する場合と失敗する場合を区別できます。実務でも、登録済みと未登録の入力を少数ずつ試すと、数式の設定を確認しやすくなります。

スポンサーリンク

VLOOKUPの4つの引数と完全一致

まずはC2で単価180を返す

C2に次の式を入力します。関数の引数とは、何を探すか、どの範囲を使うかなど、関数へ渡す指定のことです。カンマで区切った四つの指定を、左から順に読みます。

=VLOOKUP(A2,$F$2:$H$5,3,FALSE)
  1. A2は検索値です。注文表のP102を使います。
  2. $F$2:$H$5は検索に使う表の範囲です。左端のF列でコードを探します。
  3. 3は返す列の番号です。範囲の左端から数えて3列目のH列を指定します。
  4. FALSEは完全一致の指定です。P102と一致するコードの行を探します。

結果は180です。F列で見つけた行を基準にH列を読むため、G列の商品名を経由して単価を探すわけではありません。商品名が必要なら列番号を2にすれば、同じP102に対応するボールペンが返ります。

VLOOKUPが値を返す流れ(1. 検索値、2. 行を探す、3. 列を選ぶ、4. 値を返す)
検索に使う列と、値を返す列を分けて読みます。

列番号は、シート全体のA列から数える番号ではありません。H列はシートでは8列目ですが、指定範囲F2:H5ではF列が1、G列が2、H列が3です。8を指定すると、三列しかない範囲から8列目を返すことになり、#REF!の原因になります。

商品コードにはFALSEか0を指定する

第4引数のFALSEは、数値の0でも指定できます。商品コードでは、似たコードの商品の単価を代用してはいけないため、完全一致を使います。コードの一部が似ていることと、同じ商品であることは別です。

第4引数を省略するとTRUE、つまり近似一致として扱われます。「見つからなければエラーになるはず」と思って省略すると、別の商品の単価が返っても気づけません。完全一致と近似一致の指定や列番号の数え方は、MicrosoftのVLOOKUP関数の説明でも確認できます。

注文金額は、単価が正しいことを確認してからD2へ=B2*C2と入力します。数量3に単価180を掛けるので540です。単価を取る式と金額を出す式を分けておくと、金額が違うときに、検索結果と掛け算のどちらを調べればよいか分かります。

スポンサーリンク

絶対参照でコピー後の検索範囲を固定する

動かすセルと固定する範囲を分ける

一件が正しく返ったら、C2をC5まで下へコピーします。A2はA3、A4、A5へ変わり、各行の商品コードを検索します。一方、マスターはどの注文でも同じ範囲を使うので、$F$2:$H$5を固定します。このように$で行や列を固定する指定が絶対参照です。

=VLOOKUP(A3,$F$2:$H$5,3,FALSE)
=VLOOKUP(A4,$F$2:$H$5,3,FALSE)
=VLOOKUP(A5,$F$2:$H$5,3,FALSE)

コピー後はC3が90、C4が120、C5が#N/Aになります。C3とC4はマスターの単価と一致し、C5は未登録のP999なので見つからない状態です。まずこの並びを確かめてから、D2の掛け算をD4までコピーすると、D3は180、D4は600になります。

$なしのF2:H5をコピーすると、次の行ではF3:H6、さらに次はF4:H7へ動きます。練習表ではP104は途中までその範囲に残るため、C3だけ見れば成功しているように見えます。しかしP101のあるF2は外れてしまい、C4で見つからなくなります。

下へコピーするだけなら行番号の固定が中心になりますが、後で横方向へコピーする可能性も考え、ここでは列も行も固定しています。注文表の検索値を$A$2にしてしまうと、全行がP102を探し続けます。すべて180になったときは、検索範囲だけでなく検索値の固定も見直します。

別シートに分けても考え方は同じ

商品マスターを「商品一覧」シートの同じF2:H5へ移した場合は、範囲の前にシート名を付けます。注文表は元のシートに残す想定です。

=VLOOKUP(A2,'商品一覧'!$F$2:$H$5,3,FALSE)

シートを分けるときは、先にデータの移動先を確認し、数式の範囲を選び直します。別シートにしたこと自体は、未登録や型の違いを解消しません。以降の例は、最初の一枚のシートの配置で説明します。

次のページへXLOOKUPで検索列と単価列を直接指定する
スポンサーリンク
  1. 秋の戸口に並ぶかぼちゃの明かりとかぶ、麦束
  2. 資料を手に落ち着いて話し合う二人
  3. ノートパソコンと資料、外付け記憶装置がある机
  4. 冬の木で越冬する卵のうやミノムシ、テントウムシ
  5. 青い折り鶴と三角に折った紙、無地の折り紙