N/A表示、非表示について

このQ&Aのポイント
  • Excel2010でVLOOKUP関数を使用してデータをマトリクス表に変換していますが、一部のセルには#N/Aが表示されています。
  • 特に0109の列だけが#N/A表示が残っており、他の列では正しく表示されています。
  • 新たにダミー列を追加することで#N/A表示を非表示にすることができますが、他にも解決方法はあるのでしょうか?
回答を見る
  • ベストアンサー

#N/Aの表示、非表示について

excel2010 あるwebサイトにvlookup関数の高速化という内容が掲示されていたので、 それを使用してみました。 そこで、ちょっとおかしな状況になっているので、 それに関する質問です。 構成 SHEET5に下記の様なデータがあります。 A列にALLコード、B列にデータです ALLコード          データ 0109S10100100B60   722 0110H10100110B32   18 0110S10100020B62   0 0110S10100040B62   77 0110S10100050B62   19 0110S10100070B62   35 0110S10100090B62   16 0110S10100100B60   200 0111H10100110B32   41 0111S10100030B62   68 0111S10100040B62   70 0111S10100050B62   32 0111S10100070B62   60 0111S10100080B62   17 0111S10100090B62   25 0111S10100100B60   100 0112H10100110B32   14 0112H20100020B41   11 0112H20100030B42   89 0112H20100040B43   23 0112H20100050B42   27 0112H20100070B44   5 0112H20100080B40   17 0112S10100010B62   11 0112S10100020B62   12 0112S10100030B62   69 上記ALLコードの先頭4桁はシリアル番号になっており、 実際のコードは、それ以降の12桁なので、異なるシートにVLOOKUP関数で下記の様に マトリクス表にしました。 A列:コード B列:0109 C列:0110 D列:0111 でB2セルに =IF(INDEX(Sheet5!$A$2:$A$1000004,MATCH(CONCATENATE(B$1,$A2),Sheet5!$A$2:$A$1000004,1),1)=CONCATENATE(B$1,$A2),VLOOKUP(CONCATENATE(B$1,$A2),Sheet5!$A$2:$B$1000004,2,TRUE),NA()) という式を入れて、対象範囲B2:D15までコピーしています。 コード          0109   0110   0111 S10100081B62   #N/A   #N/A   #N/A S10100091B62   #N/A   #N/A   #N/A S10100110B69   #N/A   #N/A   #N/A S10100100B60   722   200    100 S10100120B60   #N/A   #N/A   #N/A S10100010B62   #N/A   #N/A   #N/A S10100020B62   #N/A   0     #N/A S10100030B62   #N/A   #N/A    68 S10100040B62   #N/A   77     70 S10100050B62   #N/A   19     32 S10100060B62   #N/A   #N/A   #N/A S10100070B62   #N/A   35     60 S10100080B62   #N/A   #N/A    17 S10100090B62   #N/A   16     25 N/Aがあると見づらいので、 式のNA()を削除し、 B2セル =IF(INDEX(Sheet5!$A$2:$A$1000004,MATCH(CONCATENATE(B$1,$A2),Sheet5!$A$2:$A$1000004,1),1)=CONCATENATE(B$1,$A2),VLOOKUP(CONCATENATE(B$1,$A2),Sheet5!$A$2:$B$1000004,2,TRUE),) で対象範囲コピーしたところ、下記の様な結果になりました。 コード          0109   0110   0111 S10100081B62   #N/A     0      0 S10100091B62   #N/A     0      0 S10100110B69   0       0      0 S10100100B60   722     200     100 S10100120B60   0       0       0 S10100010B62   #N/A     0      0 S10100020B62   #N/A     0      0 S10100030B62   #N/A     0      68 S10100040B62   #N/A     77      70 S10100050B62   #N/A     19      32 S10100060B62   #N/A     0       0 S10100070B62   #N/A     35      60 S10100080B62   #N/A     0       17 S10100090B62   #N/A     16      25 0110と0111は正しく表示しているのですが、0109列は#N/Aが残っています。 コピーペーストを間違ったわけではありませんが、 何故0109だけ#N/A表示が残っているのか、想定される原因を教えていただきたく。 ちなみにALLコード先頭に 0108S10100100B60 888 を追加して1列増やすと、 コード       0108   0109   0110   0111 S10100081B62   #N/A   0     0     0 S10100091B62   #N/A   0     0     0 S10100110B69   0     0     0      0 S10100100B60   888    722    200   100 S10100120B60   0     0     0      0 S10100010B62   #N/A   0     0     0 S10100020B62   #N/A   0     0     0 S10100030B62   #N/A   0     0     68 S10100040B62   #N/A   0     77     70 S10100050B62   #N/A   0     19     32 S10100060B62   #N/A   0     0      0 S10100070B62   #N/A   0     35     60 S10100080B62   #N/A   0     0     17 S10100090B62   #N/A   0     16     25 の様になり、0109の#N/A表示は解消されました。 EXCELの仕様なのでしょうか? とりあえず、ダミー列のデータ挿入で非表示にすれば、 見た目上は、すっきりですが、何か異なる方法があれば教えていただきたく。 ※実際は、もっと行・列共に数が多いのですが、抜粋で例をあげています。

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

  • ベストアンサー
  • Chiquilin
  • ベストアンサー率30% (94/305)
回答No.2

高速化したいから二分検索(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」みたいなダミーの値を入れ ておく手もありますけど。

3620313
質問者

お礼

回答ありがとうございます。 0のダミーではなく計算式を組み込んで対応しました。 ばっちりでした。 こんなに早く回答いただき助かりました(^^)

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8506/19341)
回答No.4

>何故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関数がエラーを起こす場合を除外する などの方法を取らないといけません。

3620313
質問者

お礼

回答ありがとうございます。 凄くわかりやすい解説で理解できました(^^)

  • f272
  • ベストアンサー率46% (7992/17078)
回答No.3

> EXCELの仕様なのでしょうか? その通りです。 MATCH(CONCATENATE(B$1,$A2),Sheet5!$A$2:$A$1000004,1) というようにMATCH関数を使っていますが,検査値以下の最大の値が検索されます。 "0110..."の場合は完全一致が見つからなくてもそれよりも小さいものがありますから,それを返しますからとりあえずNAにはなりません。”0109...”を探そうとすると返すものがありません。 対処法としては Sheet5の最初の行に 0000000000000000 0 のようなダミーを入れておけばよいでしょう。

3620313
質問者

お礼

回答ありがとうございます。 対処法まで参考になりました。

  • kkkkkm
  • ベストアンサー率65% (1597/2433)
回答No.1

Vlookupではなく他の関数の結果で#N/Aが出てるのだと思いますので、それぞれの関数で正しく結果が返されているか調べてみてはいかがでしょう。 もしくはIFERROR関数と使うとか。

3620313
質問者

お礼

回答ありがとうございます。 列を増やしたときに#N/Aが0になる”からくり”が知りたかったのです。

関連するQ&A

  • スプレットシートで#N/Aを表示させない

    申し訳ありません、スプレットシートで 1つ教えて頂けないでしょうか。 入力シートと単価シートがあります。 入力シートはA列から品番,単価1,単価2,単価3,部品,単価1,単価2,単価3となります。 単価シートはA列から品番,単価1,単価2,単価3で3行、1行空けて6行からは 部品,単価1,単価2,単価3で3行になります。 品番  単価1 単価2 単価3 あ   50 60 70 い   80 90 100  う   110 120 130 QQ   10 20 30 WW   40 50 60 EE   70 80 90 この様になります。 入力シートのA列で品番,E列で部品を入力すると単価シートを参照し B列からD列に品番単価,F列からH列に部品単価が表示されるようにしました。 そこで現状のコードだとE列に値が無くても部品単価1,2,3に#N/Aが セットされてしまいます。 下記のコードをA列,E列がセットされていない時は何もしないようにしたいのです。 function WriteVlookup() { var sheet = SpreadsheetApp.getActive().getSheetByName('入力シート'); var myCell = sheet.getActiveCell(); var myRow=myCell.getRow(); var myColumn=myCell.getColumn(); if(myColumn==1 && myRow>=2 ){ for(var i = 2; i <= 4; i++) { strformula ='=VLOOKUP($A' + myRow + ',\'単価シート\'!$A$2:$D$4,' + i + ',False)'; sheet.getRange(myRow, i).setFormula(strformula); strformula2 ='=VLOOKUP($E' + myRow + ',\'単価シート\'!$A$6:$D$8,' + i + ',False)'; sheet.getRange(myRow, i + 4).setFormula(strformula2); } } }; 例えば入力シートであと A列に入力すると E列まだ空白なのでF列からは#N/Aと表示されてしまいます。 A   B C D E F G H あ  50 60 70 #N/A #N/A #N/A い 80 90 100 QQ 40 50 60 上記のコードをどのように修正すれば#N/Aが 表示されなくなりますか? 宜しくお願いします。

  • VLOOK関数で#N/Aエラーの回避法

    お伺いします。 sheet1のA列に商品コード、B列に前月実績があるとします。 sheet2に10月実績表があるとします。 sheet1のB1セルに =VLOOKUP(A1,sheet2!$A$3:$H$1200,5,0) が入力されています。 10月に実績がゼロの時はsheet2の表にはその商品コードの行がない。 これを前提にするとsheet1のB1セルには#N/Aが表示されてしまいます。 すると合計ができません。#N/A を空白または実績なしと表示したいのです。 また、合計値を正確に出したいのです。 どうか、お知恵をお貸しください。

  • 《エクセル》「エラー値“#N/A”の場合は何も表示しない」としたいのです

    エクセル2000で作業をしています。 VLOOKUPを使って、別ワークシートにあるデータを拾っているのですが、データが存在しないものは“#N/A”と表示されますよね? これがたくさんあると見た目にあまりよろしくないので、「そのセルがエラー値“#N/A”の場合は何も表示しない」としたいのですが、式の設定がよくわかりません。 ためしにVLOOKUPの外側をIFで囲んでみたのですが、 =IF(A1=#N/A,"",VLOOKUP(A1,参照するワークシート名!B1:F100,1,FALSE)) ↑これではエラーが出てしまいました。 よろしくお願いします。

  • #N/A の消し方

    セルI11に =INDEX(形材!D:D,MATCH(B11&C11&D11,INDEX(形材!$E$1:$E$10000&形材!$F$1:$F$10000&形材!$G$1:$G$10000,),0))&"" 上記の関数だと、B、C、Dに何も入力しなくてもI11は空白なのですが、 違うシートのセルH7に =INDEX(部品!D:D,MATCH(B7,INDEX(部品!$E$1:$E$10000,),0))&"" を入れると、Bに何も入力しないとH7に#N/Aが表示されます。 #N/Aを表示させない方法はありますか

  • スクリプトの#N/A対策

    前回は大変丁寧な回答ありがとうございました。 申し訳ありません、今一度スプレットシートで 1つ教えて頂けないでしょうか。 前回同様の内容に入力列を1つ追加したいのです。 入力シートと単価シートがあります。 入力シートはA列から品番,単価1,単価2,単価3,部品,単価1,単価2,単価3となります。 単価シートはA列から品番,単価1,単価2,単価3で3行、1行空けて6行からは 部品,単価1,単価2,単価3で3行になります。 品番  単価1 単価2 単価3 あ   50 60 70 い   80 90 100  う   110 120 130 QQ   10 20 30 WW   40 50 60 EE   70 80 90 この様になります。 入力シートのA列で品番,E列で部品を入力すると単価シートを参照し B列からD列に品番単価,F列からH列に部品単価が表示されるようにしました。 そこで現状のコードだとE列に値が無くても部品単価1,2,3に#N/Aが セットされてしまいます。 下記のコードをA列,E列がセットされていない時は何もしないようにしたいのです。 function WriteVlookup() { var sheet = SpreadsheetApp.getActive().getSheetByName('入力シート'); var myCell = sheet.getActiveCell(); var myRow=myCell.getRow(); var myColumn=myCell.getColumn(); if(myColumn==1 && myRow>=2 ){ for(var i = 2; i <= 4; i++) { strformula ='=VLOOKUP($A' + myRow + ',\'単価シート\'!$A$2:$D$4,' + i + ',False)'; sheet.getRange(myRow, i).setFormula(strformula); strformula2 ='=VLOOKUP($E' + myRow + ',\'単価シート\'!$A$6:$D$8,' + i + ',False)'; sheet.getRange(myRow, i + 4).setFormula(strformula2); } } }; 例えば入力シートであと A列に入力すると E列まだ空白なのでF列からは#N/Aと表示されてしまいます。 A   B C D E F G H あ  50 60 70 #N/A #N/A #N/A い 80 90 100 QQ 40 50 60 上記のコードをどのように修正すれば#N/Aが 表示されなくなりますか? 宜しくお願いします。

  • エクセルのVLOOKUP関数で#N/A エラーが出ます

    同じように60行ほど、コピーしたのですが、k列の2行目とl列の3行目だけが#N/Aになります。試しに、検索の型のところを1にしてみたら、他の語になります。 ちなみに、k列の2行目とl列の3行目は対応する語なのです。 いろいろと調べているのですが原因がわかりません。 これを元に多数のデータを処理したいと思っているので困っています。 1部だけを見て判断できにくいと思いますが、アップしにくいのでどうしたらよいかわかりません。 何か手がかりでも教えていただけたらと思います。よろしくお願いします。     k列                  l列 =VLOOKUP(B16,$A$16:$F$20,5,0)    =VLOOKUP(C16,$A$16:$F$20,6,0) =VLOOKUP(B17,$A$16:$F$20,5,0) #N/A =VLOOKUP(C17,$A$16:$F$20,6,0)  =VLOOKUP(B18,$A$16:$F$20,5,0)    =VLOOKUP(C18,$A$16:$F$20,6,0)  #N/A  =VLOOKUP(B19,$A$16:$F$20,5,0)    =VLOOKUP(C19,$A$16:$F$20,6,0) =VLOOKUP(B20,$A$16:$F$20,5,0)    =VLOOKUP(C20,$A$16:$F$20,6,0)

  • VLOOKUP関数 #N/A

    エクセルのVLOOKUP関数で 「10月シート」の「A会社」の一つ右の列の値を取得したいのですが 10月シートにA会社が存在しない場合は#N/Aが返ります。 数式は、=VLOOKUP(“A会社”, 10月シート!$a$1:$b$2,1,0) としています。 #N/Aにならないようにする方法を教えてください。

  • #N/A を計算式をそのままで”0”表示にしたい

    教えてください。 EXCEL VBA のマクロ作成で、 データを他のシートからコピー貼付(形式を選択して貼付の中のリンクの貼付)をします。 すると計算式(VLOOKUP)のある部分は数値がない時、(#N/A)がそのままになってしまいます。"0"表示にしたいのです。 データがある時は、計算結果を表示させるようにする。      10月  11月  12月  1月   2月   3月 Aさん   20   50   3    2   10    7   Bさん   15   30   5    5   12    10 合計    35   80   8    7   22    17 Cさん   #N/A  #N/A  #N/A  #N/A  20   #N/A Dさん   #N/A  #N/A  #N/A  #N/A  #N/A  #N/A 合計    #N/A  #N/A  #N/A  #N/A  20   #N/A  ・  ・  ・ 計算式は消えないようにしたい。 よろしくお願いいたします。

  • vlookup関数で#N/Aエラーが出ます

    エクセル2000を使用しています。 "Sheet5"のM列にある「商品コード」を元に別シート"商品金額マスタ"から 商品金額を"Sheet5"のO列に表示させたいのですが、#N/Aエラーが出てしまいます。 O列には以下の数式を入れています。 =IF($M2="","",VLOOKUP($M2,商品金額マスタ!$A$2:$C$5,3,FALSE)) M列の各セルをクリックするとなぜか数式が反映され、O列に正しい値(商品金額)が表示されるのですが、 これはどういったことなのでしょうか? "Sheet5"のM列は元々"Sheet5"のA列にある商品コードの左6文字をLEFT関数で選んでいます。 この6文字は頭にゼロがつく商品コード1桁から4桁のものです。 #N/Aエラーが出るのは、このゼロが原因だったりしますでしょうか? どうぞよろしくお願いします。 "商品金額マスタ"     A列     B列      C列 1  商品コード  商品名    商品金額(税抜) 2  000001    Tシャツ     2,660 3  000002    パンツ      3,000 4  000003    タンクトップ   3,000 5  000004    長袖Tシャツ    3,000

  • #N/Aとは?(すみません長文です)

    いつも参考にさせていただいています。 Windows98のExcelでIF関数とVLOOKUP関数を使った表を作っているのですが、 式を入力したセルが『#N/A』となってしまい困っています。 <Sheet1>                A   B   C   D          1 コード  氏名  項目1 項目2 2 0001 佐藤太郎 3 0002 佐藤次郎      4     ・ 5     ・ <Sheet2>   A    B   C   D 1 氏名  項目1 項目2 2 佐藤次郎 2 10 3 加藤花子  4 15   4 佐藤太郎  1 8 5 <Sheet2>に元のデータが入っています。<Sheet1>の"C2"以降に式をいれ、 氏名で検索してデータを参照できるようにしたいです。 それで式を =IF(A2="","",(VLOOKUP(B2,Sheet2!$A$1:$K$126,2,FALSE))) と入れたのですがエラーになってしまいました。 できればどちらのシートも並べかえずに使いたいと思っています。 どなたか解決策をご存知でしたら教えて下さい。よろしくお願い致します。

専門家に質問してみよう