ExcelのIF関数で条件一致した別シートの値を自動反映する方法!

ExcelのIF関数で条件一致した別シートの値を自動反映する方法!
ExcelのIF関数で、条件一致した別シートの値を自動反映したいときはないでしょうか。

けど、そんな中で悩むことは、

・別シートの値をVLOOKUPで引くと、該当がないとき #N/A エラーが出てしまう
・入力セルが空欄なのに、なぜかエラーや0が表示される
・数式は書けたけれど、シート名!範囲 の指定のしかたに自信がない

ですよね。

今回はそんなお悩みを解決する

・IF関数とVLOOKUP・COUNTIFで、条件一致した別シートの値を自動反映する方法
・エラーを出さずに空欄で表示する書き方

についてまとめます!

完成イメージ

別シート(商品マスタ)に登録したデータを、IF関数とVLOOKUPで条件一致したときだけ自動反映させます。
今回は
・入力した商品コードに一致する商品名と単価を、別シートのマスタから自動で引く方法(=IF(COUNTIF(…)=0,””,VLOOKUP(…)))
をゴールにします。
該当するコードがないときや入力セルが空欄のときは、#N/Aではなく「空欄」で表示されるようになります。

完成イメージ(商品コードから商品名と単価が自動反映された表)
上の画像が完成形です。商品コードを入力するだけで、マスタの商品名と単価が自動で反映されます。

なお、エラーを出さないための書き方(IF+COUNTIF/IFERROR/IFNAの比較)と、数式を一括で入れるVBA、うまくいかないときの対処法(トラブルシュート)もあわせてご紹介します。
早速実装して試してみましょう!

STEP1. 元データになる「商品マスタ」を用意する

まずは、参照される側の元データ(商品マスタ)を用意します。
実際の業務では「商品マスタ」という別シートに作っておくのがおすすめです。
今回は1枚のシートで動きを確認できるように、入力表の下(13行目以降)にまとめて置いて説明します。
A列が商品コード、B列が商品名、C列が単価です。
商品コードは A001 のような形式で、10件登録しました。
この表を、これから入力表から参照して引っ張ってきます。
なお、参照先のシートは必ず同じブック内に用意します。
別のブックのシートを参照すると、そのブックを閉じたときにエラーになってしまうためです。
商品マスタの表(商品コード・商品名・単価)

下の表をコピーして、Excelのシートに貼り付けるとそのまま試せます。

商品コード(入力) 商品名(自動) 単価(自動)
A001
A002
A999
A005
A003
A007
A010
A004
A009
A006
■ 商品マスタ(本来は別シートに置くデータ)
商品コード(マスタ) 商品名(マスタ) 単価(マスタ)
A001 ノートPC 128000
A002 モニター 32000
A003 キーボード 4800
A004 マウス 2200
A005 プリンタ 29800
A006 外付けHDD 9800
A007 USBメモリ 1500
A008 Webカメラ 4500
A009 ヘッドセット 6800
A010 スキャナー 19800

※ 数式で求める列は空にしています。すでに値が入っている列はそのまま残して試せます。

STEP2. 商品コードを入力する表を作る

次に、商品コードを入力する表を作ります。
1行目が見出しです。
A列に商品コードを入力すると、B列に商品名、C列に単価が自動で表示されるようにします。
今回はあらかじめA列(2〜11行目)に商品コードを入力しておきました。
B列とC列は、このあと数式を入れるので空のままにしておきます。
A4セルには、あえてマスタに存在しないコード(A999)も入れてあります。
うまくエラーを防げるか、あとで確認しましょう。
商品コードを入力する入力表(商品名・単価は空欄)

STEP3. IF関数とCOUNTIFで「一致したときだけ表示」する数式を入れる

B2セルに、次の数式を入力します。

=IF(COUNTIF(入力表!$A$14:$A$23,$A2)=0,"",VLOOKUP($A2,入力表!$A$14:$C$23,2,FALSE))

この数式は、「該当があれば値を返し、なければ空欄にする」という意味です。
まず COUNTIF で、入力したコードがマスタに何件あるかを数えます。
0件(=存在しない)なら “” を返し、1件以上あれば VLOOKUP で商品名を引っ張ります。
1つの数式に「存在チェック」と「値の取得」をまとめて入れるのがポイントです。
B2セルに入力したIF・COUNTIF・VLOOKUPの数式

STEP4. 単価を引く数式を入れる(列番号を3に変える)

C2セルには、B2セルと同じ数式の最後の列番号を3に変えたものを入力します。

=IF(COUNTIF(入力表!$A$14:$A$23,$A2)=0,"",VLOOKUP($A2,入力表!$A$14:$C$23,3,FALSE))

VLOOKUPの3は「範囲の左から3列目(単価)」を意味します。
商品名は2列目、単価は3列目なので、引っ張る列に合わせて番号を変えましょう。

別シートを参照するときの書き方

数式は、シート名のあとに ! を付けて シート名!範囲 の形で参照しています。
今回は同じシート内のマスタを見ているので、シート名は 入力表! になっています。
もし商品マスタを別シート(シート名:商品マスタ)に分けた場合は、入力表! の部分を 商品マスタ! に置きかえるだけです。

=IF(COUNTIF(商品マスタ!$A$2:$A$11,$A2)=0,"",VLOOKUP($A2,商品マスタ!$A$2:$C$11,2,FALSE))
=IF(商品マスタ!A1<>"", 商品マスタ!A1, "")

「参照先が空欄でなければその値を表示し、空欄なら空欄にする」という意味です。
セル1つをそのまま持ってくるだけなら、この形がもっともシンプルです。
今回のようにコードで検索して別の列を引く場合は、COUNTIFとVLOOKUPを組み合わせましょう。
シート名に空白や記号が含まれるときは ‘シート名’!範囲 のようにシングルクォーテーションで囲みます。
C2セルに列番号3で入力したVLOOKUPの数式

STEP5. 数式を下までコピーして結果を確認する

B2セルとC2セルを選び、フィルハンドルを下の11行目までドラッグしてコピーします。
すると、A列の商品コードに合わせて、B列に商品名、C列に単価が自動で表示されます。
数式の中で $(絶対参照) を付けているので、マスタの範囲はずれません。
コピーしても検索範囲が固定されているのがポイントです。
カンタンですね。
数式を下までコピーして商品名と単価が表示された状態

STEP6. 空欄や存在しないコードでもエラーにしない

ここで、うまくエラーを防げているか確認してみましょう。
試しにA3セルを空欄にしてみます。
すると、B3セルとC3セルはエラーではなく、きれいに空欄になりました。
これは、入力セルが空欄だと COUNTIF が0件を返すためです。
同じく、マスタに存在しない A4セル(A999) の行も、#N/Aにはならず空欄になっています。
先に存在チェックをしてからVLOOKUPするのが、#N/Aを出さないコツです。
空欄と存在しないコードでもエラーにならず空欄で表示された状態

#N/Aを防ぐ3つの方法をくらべる

VLOOKUPのエラーを防ぐ方法は、今回のIF+COUNTIF以外にもあります。
それぞれの特徴を整理しました。

方法 数式 こんなときに
IF + COUNTIF =IF(COUNTIF(範囲,値)=0,””,VLOOKUP(…)) 存在チェックを明示したい/空欄も「」にしたい
IFERROR =IFERROR(VLOOKUP(…),””) 短く書けて、あらゆるエラーをまとめて「」にしたい
IFNA =IFNA(VLOOKUP(…),””) #N/Aだけを「」にしたい(ほかのエラーは残したい)
POINT

条件一致した値を別シートから引くときは、
=IF(COUNTIF(検索範囲, 値)=0, “”, VLOOKUP(値, 範囲, 列番号, FALSE)) の形がおすすめです。
先に「存在するかどうか」を確認してから引くことで、エラーを出さずに空欄で表示できます。

VBAでIF+VLOOKUPの数式を一括入力する

行数が多いときは、VBAで数式をまとめて入れるのがラクです。
Alt+F11でVBAエディターを開き、標準モジュールに貼り付けて実行します。

Sub SetIfVlookup()
    Dim r As Long, lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For r = 2 To 11
        Cells(r, 2).Formula = "=IF(COUNTIF($A$14:$A$23,$A" & r & ")=0,"""",VLOOKUP($A" & r & ",$A$14:$C$23,2,FALSE))"
        Cells(r, 3).Formula = "=IF(COUNTIF($A$14:$A$23,$A" & r & ")=0,"""",VLOOKUP($A" & r & ",$A$14:$C$23,3,FALSE))"
    Next r
End Sub

タカヒロ

タカヒロ
VLOOKUPの第4引数 FALSE は「完全一致で探す」という意味です。
TRUE(近似一致)にすると別の商品を拾ってしまうので、コード検索では必ず FALSE を付けましょう。
数式の中の $A$14:$C$23 は、マスタを別シートにした場合は 商品マスタ!$A$2:$C$11 に書き換えてくださいね。

うまく反映されないときの対処法(トラブルシュート)

実際に試すと、思ったように表示されないこともあるかもしれません。
よくあるつまずきと対処法をまとめました。

症状 原因 対処
#N/A が表示される COUNTIFの範囲がずれている/存在チェックが外れている COUNTIFの範囲とVLOOKUPの範囲を同じマスタ($A$14:$C$23)に合わせる
商品名が表示されない(空欄のまま) コードが数値と文字列で食い違っている A列のコードとマスタのコードのデータ型を揃える(=TEXT() や「区切り位置」で統一)
下にコピーしたら値がずれる 範囲に $(絶対参照) が付いていない 検索範囲を $A$14:$C$23 のように固定する
数式を入れても空欄になる 入力したコードがマスタに存在しない マスタのコードを確認する(今回はエラーではなく空欄で表示されます)
別シートの値を変えても反映されない 計算方法が「手動」になっている 数式タブ → 計算方法の設定 → 自動 にする/F9 で再計算する
別のブックを参照したら #REF! になる 参照先のブックを閉じてしまった マスタは同じブック内の別シートに置く
シート名を変えたら #REF! になった 参照先のシート名が変わった 数式内のシート名を新しい名前に書き換える

関数の説明

今回使う3つの関数の概要です。
役割を分けて覚えると、数式を組み立てやすくなります。

IF関数(イフ)

書式 =IF(論理式, 真の場合, 偽の場合)
できること 条件に合うかどうかで、表示する内容を切り替えます。
戻り値 真の場合の値/偽の場合の値
こんなときに 「存在チェックの結果が0なら空欄、そうでなければ値を表示」のように分けたいとき。
注意 2番目と3番目の引数はカンマで区切ります。空欄を返したいときは “”(ダブルクォーテーション2つ)を指定します。
=IF(COUNTIF(範囲,値)=0,"",VLOOKUP(値,範囲,列番号,FALSE))

COUNTIF関数(カウントイフ)

書式 =COUNTIF(範囲, 検索条件)
できること 指定した範囲の中で、条件に一致するセルの個数を数えます。
戻り値 個数(数値)。存在しなければ 0 になります。
こんなときに VLOOKUPの前に「その値がマスタに存在するか」を確認したいとき。
注意 見た目が同じでも、数値と文字列は別物として数えられます。コードの型を揃えておきましょう。
=COUNTIF(入力表!$A$14:$A$23, $A2)

VLOOKUP関数(ブイルックアップ)

書式 =VLOOKUP(検索値, 範囲, 列番号, 検索方法)
できること 範囲の左端の列を検索し、同じ行の指定した列番号の値を返します。
戻り値 一致した値。見つからない場合は #N/A になります。
こんなときに 商品コードから商品名や単価など、別シートの表の値を引っ張りたいとき。
注意 検索値の列は範囲の左端に置きます。第4引数は完全一致を表す FALSE を指定しましょう。
=VLOOKUP($A2, 入力表!$A$14:$C$23, 2, FALSE)

完成

商品コードを入力するだけで、マスタから商品名と単価が自動で反映されました。
存在しないコードや空欄のときも、#N/Aではなく空欄で表示されています。
思ったとおりに動きましたか?
マスタを別シートに分けておけば、マスタを更新するだけで入力表の内容も自動で最新になります。
完成した表(商品コードから商品名と単価が自動反映)

さいごに

いかがでしょうか。

今回は、

・ExcelのIF関数で条件一致した別シートの値を自動反映する方法(IF+COUNTIF+VLOOKUP)

についてまとめました。

まずは今回のサンプル表で、ぜひ一度試してみてください。
先に存在チェックをする書き方を覚えておくと、#N/Aに悩まされなくなりますよ。
また、他にも便利なExcelの時短テクニックがありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。






コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA ImageChange Image