• ベストアンサー

エクセル関数で検索能力がある関数を教えてください。

「シート1」と「シート2」があります。 「シート1」には   1      2 A 通信費  課税仕入 B 借入金  対象外 C 支払利息 非課税仕入 のような表があります。 「シート2」には   1     2 A 通信費 B 交際費 となっていたとします。 この場合、「シート2」のセルA2に、 VLOOKUP関数で「シート1」を参照し、「課税仕入」を表示させることはできるのですが、 「シート2」のセルB2にセルA2の関数をコピーした場合、 「シート2」のセルB1にセルに表示されている「交際費」は「シート1」の表には登録していないため、セルB2にはエラー値が表示されてしまいます。 「シート1」の表に「交際費」を登録すればいいのですが、 自己都合上、「シート2」のセルB2に、 「シート2」セルB1の項目が「シート1」の「1列目」にあれば、「2列目」の項目を表示する。 「シート1」の「1列目」に該当する項目が無ければ、「シート2」のセルB2には「対象外」と表示するようにしたいのです。 言い換えますと、「シート2」の通信費は「シート1」にあるのでVLOOKUP関数で課税仕入を導くことが出来ます。 しかし、「シート2」の交際費は「シート1」に無いため、VLOOKUP関数をしようできません。 「シート1」に無い項目の場合には、「シート2」に「対象外」と表示されるような関数の式が知りたいです。 わかりにくい文章になってしまいましたが、よろしくお願いします。

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

  • ベストアンサー
  • mysticage
  • ベストアンサー率32% (52/158)
回答No.1

=IF(ISERROR(VLOOKUP(A1,Sheet1!A:B,2,0))=TRUE,"対象外",VLOOKUP(A1,Sheet1!A:B,2,0)) こういう式を、シート2のA2にいれて、B2にもコピーしてください IF と ISERROR関数を組み合わせています。 もし、VLOOKの式での返り値が、エラーだったならば、対象外を表示せよ、そうでないなら、VLOOKの式で帰ってくる値をそのまま表示していいよ という式になっています

yachiyoshi
質問者

お礼

返事が遅れてしまいまして申し訳ありません。 問題は解決しました! ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

質問表現に付いて (1)   1      2 A 通信費  課税仕入 B 借入金  対象外 C 支払利息 非課税仕入 はシートを移したものなら   A    B   C 1 通信費 借入金 2 課税仕入 のようにシートと同じ行と列の表現してください。 これを守らないと、読みにくい。 (2)質問の表現が長いのですが VLOOKUPで検索表に見つからないアイテムの場合、「対象外」と 出したい、ということではないのでしょうか? A1:B5 コード 内容 1 a 2 b 3 c 4 d D3:E5 3 c 6 対象外 1 a E3の式 IF(ISERROR(VLOOKUP(D3,$A$2:$B$5,2,FALSE)),"対象外",VLOOKUP(D3,$A$2:$B$5,2,FALSE)) D4以下に式を複写。

yachiyoshi
質問者

お礼

ご指摘ありがとうございます。 (1)質問表現について (2)質問が長いことについて おっしゃるとおりです。 シートを写したつもりだったんですが、「ABC」と「123」の場所を逆にしてしまいました。 すいません。 文章わかりづらくなってしまったことをお詫びいたします。

すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.4

ご質問の内容が 「詮索機能を実現するにはどのような構文がありえるのか網羅したい」 と言うこととお見受けしましたので 愚考して式を作ってみました… (*^_^*) この1件だけ出せばいいという内容からすると VLOOKUPに比べやや邪道ですが =CHOOSE(SIGN(SUMPRODUCT((Sheet1!$A$1:$A$3=$A1)*1)-1)+2,"対象外",INDEX(Sheet1!$A$1:$B$3,MATCH($A1,Sheet1!$A$1:$A$3,0),2),OFFSET(Sheet1!$A$1,LOOKUP(1,{1},SMALL((Sheet1!$A$1:$A$3<>$A1)*65555+ROW(Sheet1!$A$1:$A$2),COLUMN(Sheet1!A1)))-1,1,1,1)) =CHOOSE(SUMPRODUCT((Sheet1!$A$1:$A$3=$A1)*ROW(Sheet1!$A$1:$A$3))+1,"対象外",Sheet1!$B$1,Sheet1!$B$2,Sheet1!$B$3) =IF(COUNTIF(Sheet1!A:A,$A1)<>1,"対象外",OFFSET(Sheet1!$A$1,LOOKUP(1,{1},SMALL((Sheet1!$A$1:$A$3<>$A1)*65555+ROW(Sheet1!$A$1:$A$3),COLUMN(Sheet1!A1)))-1,1,1,1)) 最初のは長いですが CHOOSE構文のインデックスの算出法とか OFFSET構文を使っているあたりとか 検索に2件以上ヒットした場合にも右に式をコピーすれば2件目以降の値表示をするとか SMALL構文が扱う配列の作り方とか etc 自画自賛になりますが秀逸なものがあると思います また、元データの位置を1つ下にずらして頂いて 新たに空いたB1に「対象Guy」と入れて頂ければ =LOOKUP(INDEX(LARGE((Sheet6!$A$2:$A$4=$A1)*ROW(Sheet6!$A$1:$A$3),COLUMN(Sheet6!A1))+1,),ROW(Sheet6!$A$1:$A$4),Sheet6!$B$1:$B$4) とか {=INDEX(Sheet6!$A$1:$B$4,LARGE((Sheet6!$A$2:$A$4=$A1)*ROW(Sheet6!$A$1:$A$3),COLUMN(Sheet6!A1))+1,2)} とかも使えますね 最後に、DGET構文やHLOOKUP構文が使えるとなかなかなのですが DGET構文は検出条件の指定に ・見出しと検出キーが縦並びにセットになっていないといけない ・定数配列で指定できない HLOOKUP構文はデータの元フィールドが横向きに並んでいないといけない などの癖があって、ちょっと惜しいのですが使えません

yachiyoshi
質問者

お礼

色々とありがとうございます。 使ったことが無い関数目白押しです・・ これから実験させていただきます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.3

ANo.2のmaronです ◆ほかに、こんな方法もありますよ =IF(A1="","",IF(ISNUMBER(MATCH(A1,Sheet1!A:A,0)),VLOOKUP(A1,Sheet1!A:B,2,0),"対象外"))

すると、全ての回答が全文表示されます。
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.2

◆こんな方法もありますよ ◆Sheet1   A       B 1 通信費   課税仕入 2 借入金   対象外 3 支払利息  非課税仕入 ◆Sheet2   A       B 1 通信費 2 交際費 3 ◆Sheet2のB1の式 B1=IF(A1="","",IF(COUNTIF(Sheet1!A:A,Sheet2!A1),VLOOKUP(A1,Sheet1!A:B,2,0),"対象外")) ★下にコピー

yachiyoshi
質問者

お礼

返事が遅れまして申し訳ありません。 このような方法もあるんですか。 先ほど試してみました。 ありがとうございました。

すると、全ての回答が全文表示されます。

専門家に質問してみよう