こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

#N/Aを消そうとすると正常時も消えます

Excelの関数使用で困っています。

下記2行はどちらも「調査あり」となるべきなのですが、#N/Aを消すために2行目のようにISERROR関数を加えると空白になってしまいます。
何が間違っているのでしょうか?
ご教示いただけると助かります。
よろしくお願い致します。

=IF(VLOOKUP($C20,INDIRECT($K$1&"!$B$2"):INDIRECT($K$1&"!G$122"),6,FALSE)=$B20,"調査あり","")

=IF(ISERROR(VLOOKUP($C20,INDIRECT($K$1&"!$B$2"):INDIRECT($K$1&"!G$122"),6,FALSE))=$B20,"調査あり","")

投稿日時 - 2013-07-31 23:18:58

QNo.8200537

困ってます

質問者が選んだベストアンサー

二つ目の式をよく見ると、「当然かなぁ」と思いますよ。


とりあえず、二つ目の式の
  =ISERROR(VLOOKUP($C20,INDIRECT($K$1&"!$B$2"):INDIRECT($K$1&"!G$122"),6,FALSE))
の部分だけを抜き取って、セルに入れてみましょう。
ISERROR関数の返り値は、
「TRUE/FALSE」のどちらか(あるいはエラー)ですから、
これに対して「$B=20」としてしまうと、
B20セルが「TRUE/FALSE」じゃないと比較の使用が無いわけです。

で、一つ目の式で正しく「調査あり」が返るとなると、
B20セルにも何らかの(TRUE/FALSE以外の)値が入っていると推測されます。

よって、これをそのままIF関数で判断させるとすると
「ほぼ必ず否の場合が選択される」ということですね。


対策です。
・・・その前に、おそらくですが、VLOOKUPの部分は
  VLOOKUP($C20,INDIRECT($K$1&"!$B$2:$G$122"),6,FALSE)
で良いかと思います。


さてさて、やや冗長ですが、
  =IF(ISERROR(VLOOKUP($C20,INDIRECT($K$1&"!$B$2:$G$122"),6,FALSE)),"",IF(VLOOKUP($C20,INDIRECT($K$1&"!$B$2:$G$122"),6,FALSE)=$B20,"調査あり",""))

こんな感じでIFをネストして(重ねて)やるのが一番のようです。


あるいはVLOOKUP関数で完全一致を狙っているようですので、
  =IF(COUNTIF(INDIRECT($K$1&"!$B:$B"),$C20)=0,"",IF(VLOOKUP($C20,INDIRECT($K$1&"!$B$2:$G$122"),6,FALSE)=$B20,"調査あり",""))

のように「対象シートのB列に“合致するものが無い”場合は空白」としても良いかもですね。
あまり変わりませんが、ちょっとはスッキリできるかなと。



以上、参考までにどうぞ。

投稿日時 - 2013-08-01 01:13:58

お礼

大変ありがとうございました。
お陰様で解決しました。

投稿日時 - 2013-11-06 09:46:29

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

次のような式にすればよいでしょう。

=IF(COUNTIF(INDIRECT($K$1&"!B2:B122"),$C2)=0,"",IF(VLOOKUP($C20,INDIRECT($K$1&"!B2:G122"),6,FALSE)=$B20,"調査あり",""))

投稿日時 - 2013-08-01 06:47:39

お礼

お礼が大変遅くなりました。
勉強になりました。
ありがとうございました。

投稿日時 - 2013-11-06 09:50:20

ANo.2

=IF(ISERROR(VLOOKUP($C20,INDIRECT($K$1&"!$B$2"):INDIRECT($K$1&"!G$122"),6,FALSE)),"",IF(VLOOKUP($C20,INDIRECT($K$1&"!$B$2"):INDIRECT($K$1&"!G$122"),6,FALSE)=$B20,"調査あり",""))

たぶんこれでいけるはず。
ISERRORは「エラーかどうかをBooleanで返す」だけの関数なので、#N/Aを消す場合にはもう1段、IF関数を重ねる必要があります。

投稿日時 - 2013-08-01 00:52:27

お礼

早々のご回答をいただき、ありがとうございました。
大変参考になりました。
ご提示いただいた式で目的の動作が実現できました。

投稿日時 - 2013-08-01 17:06:51

ANo.1

ISERROR関数の使い方が、考え方から間違っています。


>何が間違っているのでしょうか?

あなたの計算式は
=IF(ISERROR(VLOOKUP(…))= B20,"調査有","")
と書かれています。
VLOOKUP関数がエラーになるとISERROR(VLOOKUP())の部分がTRUEになり、結果してあなたの書いた数式は
=IF(TRUE = B20, "調査有","")
となってB20はTRUEという値「ではない」ので""になります。




あなたのご質問への回答は、以上です。



#ご利用のエクセルのバージョンも書かれていないご相談ですが。

Excel2003までを使っている場合:
=IF(ISERROR(VLOOKUP()),"",IF(VLOOKUP()=B20,"調査有",""))

Excel2007以降を使っている場合:
=IFERROR(IF(VLOOKUP( )=B20,"調査有",""),"")

投稿日時 - 2013-08-01 00:51:20

お礼

早々に適切なご回答をいただきありがとうございました。
ISERROR関数の理解ができました。
Excelのバージョンも書かず申し訳ございませんでした。
Excel2003と2010を使っています。

投稿日時 - 2013-08-01 17:05:08

あなたにオススメの質問