- ベストアンサー
N/A表示、非表示について
- Excel2010でVLOOKUP関数を使用してデータをマトリクス表に変換していますが、一部のセルには#N/Aが表示されています。
- 特に0109の列だけが#N/A表示が残っており、他の列では正しく表示されています。
- 新たにダミー列を追加することで#N/A表示を非表示にすることができますが、他にも解決方法はあるのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
高速化したいから二分検索(TRUE検索)にしたということでしょうか。 確かにその量なら分かりますけど…… ただエラーの条件指定が不足しています。Sheet5の A列は昇順にデータが 並んでいますが 先頭の A2よりも小さな値を検索値にした場合にもエラー が起きます。 =IF(B$1&$A2<Sheet5!$A$2,"☆",IF(IFERROR(VLOOKUP(B$1&$A2,Sheet5!$A$2:$B$1000004,1,TRUE)=B$1&$A2,FALSE),VLOOKUP(B$1&$A2,Sheet5!$A$2:$B$1000004,2,TRUE),"★")) こうでしょうか。もちろん Sheet5の先頭に「0」みたいなダミーの値を入れ ておく手もありますけど。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
>何故0109だけ#N/A表示が残っているのか、想定される原因を教えていただきたく。 それは「MATCH関数が#N/Aエラーを返すから」です。 >あるwebサイトにvlookup関数の高速化という内容が掲示されていたので、それを使用してみました。 そのページにある「高速化」の意味、判ってますか? これの意味は 「VLOOKUP(CONCATENATE(B$1,$A2),Sheet5!$A$2:$B$1000004,2,FALSE)と書いて、完全一致する物を探すと、VLOOKUPは、検索される表の全件を対象に探すので、処理が遅くなる。なので、INDEXとMATCHを使って、完全一致する場合だけ『全件検索を行なわないVLOOKUP』を呼び出して、さもなければNA()を表示する」 です。 ここでのキモは「VLOOKUPの検索の型がTRUEになっている」と言う事です。 この「検索の型」が「TRUE」になっていると、VLOOPUPは「全件検索をせず、検索している表のデータが検索値を超えた時点で、検索を打ち切る」のです。 つまり「検索を途中でやめてしまう分、高速化する」のです。 で、この「高速化関数」では「MATCHで一番近い値を探してみて、探した結果が完全一致するかどうか」という細工をしています。 この「MATCHで一番近い値を探してみて」は、検索の型に「1」を指定していて「検査値以下の最大の値」を探すようにしています。この場合も、MATCHは「検索値を超えたら、検索を打ち切る」ので、高速です。 ここで、もし「検査値以下の最大の値」が「無かった」ら、どうなるでしょうか? その時は「MATCH関数が#N/Aを返す」のです。 「MATCH関数が#N/Aを返す」と、どうなるかと言うと「式の結果が#N/Aになる」と言う事です。 「式の結果が#N/Aになる」と言うのは「絶対的な事象」ですので、式の一部を書き換えても無駄です。つまり「式からNA()を外しても無駄」です。 では、どうすれば良いのかと言うと ・検索される表の1行目に、どんなデータよりも小さい値を入れておいて、MATCH関数が#N/Aを返す事が無いようにする ・IFERROR関数、IF関数などを用いて、MATCH関数がエラーを起こす場合を除外する などの方法を取らないといけません。
お礼
回答ありがとうございます。 凄くわかりやすい解説で理解できました(^^)
- f272
- ベストアンサー率46% (8623/18441)
> EXCELの仕様なのでしょうか? その通りです。 MATCH(CONCATENATE(B$1,$A2),Sheet5!$A$2:$A$1000004,1) というようにMATCH関数を使っていますが,検査値以下の最大の値が検索されます。 "0110..."の場合は完全一致が見つからなくてもそれよりも小さいものがありますから,それを返しますからとりあえずNAにはなりません。”0109...”を探そうとすると返すものがありません。 対処法としては Sheet5の最初の行に 0000000000000000 0 のようなダミーを入れておけばよいでしょう。
お礼
回答ありがとうございます。 対処法まで参考になりました。
- kkkkkm
- ベストアンサー率66% (1742/2617)
Vlookupではなく他の関数の結果で#N/Aが出てるのだと思いますので、それぞれの関数で正しく結果が返されているか調べてみてはいかがでしょう。 もしくはIFERROR関数と使うとか。
お礼
回答ありがとうございます。 列を増やしたときに#N/Aが0になる”からくり”が知りたかったのです。
お礼
回答ありがとうございます。 0のダミーではなく計算式を組み込んで対応しました。 ばっちりでした。 こんなに早く回答いただき助かりました(^^)