[[20060307155749]] 『IFとVLOOKUPの組み合わせ方』(のんきち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『IFとVLOOKUPの組み合わせ方』(のんきち)
 winXP,Excel2002使用
シート2にコードbニ、得られる商品名、製造時間、品質、その他もろもろが入っています。
シート1のA1にコードb入れて、
B2セルにVLOOKUP('シート1'!$A1,'シート2'!$A$1:$B$10000,2,FALSE)
という数式を入れて、コードbゥら商品名を取り出していたのですが、
シート2(A工場)だけではなく、
シート3(B工場),シート4(C工場)にもシート2と同じようなものが入っていて、
シート2で見つからなかったら、シート3で探す。
シート3で見つからなかったら、シート4で探す。
ってことをしたいんですが、
IF式との組み合わせですればいいんだろうなあとは思えるんですが、どうすればよいのか見当がつきません。
どなたかご教授いただけないでしょうか?


 ISERRORを組み込んだらいかがでしょうか?
=IF(ISERROR(VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE))=0,
 VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE),
 IF(ISERROR(VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE))=0,
 VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE),
 VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE)))
(chao)

 chao様、レスありがとうございます。
参考にさせていただき、以下で部分的に出来ました。
ただ、なぜか#N/Aが出てくるときがあるんですよね・・・。

 =IF(ISERROR(VLOOKUP($A1,'シート2'!$A$1:$B$10000,2,FALSE)),
 VLOOKUP($A1,'シート3'!$A$1:$B$10000,2,FALSE)),
 IF(ISERROR(VLOOKUP($A1,'シート3'!$A$1:$B$10000,2,FALSE)),
 VLOOKUP($A1,'シート4'!$A$1:$B$10000,2,FALSE)),
IF(ISERROR(VLOOKUP($A1,'シート3'!$A$1:$B$10000,2,FALSE)),
VLOOKUP($A1,'シート2'!$A$1:$B$10000,2,FALSE)),"未登録")))

 =VLOOKUP('シート1'!$A1,'シート2'!$A$1:$B$10000,2,FALSE)の式を使っていたときは、
シート2でA列に空白セルがあったり、重複してたりしてもちゃんとB列を読み込んでくれたんですが、今回はシート3にあるコードbヘちゃんと読み込んでくれるのですが、
シート2・シート4のコードbヘ読み込んでくれません。
上記の数式での間違いを教えて欲しいです。
ちなみにA列に同じコードbナすとB列は必ず同じになっています(シート2・3・4)

 (のんきち)

 ISERROR関数は、エラー値が出たらTRUEを返す関数です。
組み方を再考する必要があると思いますが?
(chao)

 ISERROR関数に「=0」入れたくないのであれば、
=IF(ISERROR(VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE)),
 IF(ISERROR(VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE)),
 IF(ISERROR(VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE)),
 "未登録",VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE))),
 VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE)),
 VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE)))
でしょうか?(ちょっとかっこの位置が不安)
(chao)

 何回もすみません。そしてご指摘ありがとうございます。
=0っていうのが、私の頭では理解できなくて、何回やっても#N/Aが出てくるので、
IF関数っぽく(?)勝手にいただいた数式をアレンジしてしまいました。
確かに、同じことをしているとするならば、
( )だけより、=0でくくった方が数式もきれいでわかりやすいですよね。
これからもう一度検証しなおしてみます。
そしてそしてもしよろしければ、=0の意味を教えてもらえませんか?
(のんきち)

 =IF(ISERROR(VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE))=0,
 VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE),
 IF(ISERROR(VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE))=0,
 VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE),
 IF(ISERROR(VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE))=0,
 VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE),"未登録")))
 ってするんですけど、なぜか『未登録』としか出てこないです。
ちゃんとコードbヘシート3にあるはずなんですが・・・。
データベースとなっているシート2・3・4で、
コード(A列)が重複していたり、空白があったりすると機能しなくなりますか?
VLOOKUP関数だけだと、空白があっても、重複していても
目的のものをひっぱってこれていたんですが。
関数の考え方に問題があればご指摘ください。
宜しくお願いします。
(のんきち)

 =0をいれないで、(chao)さんが最後に示されている数式でいかが?

 =IF(ISERROR(VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE)),
  IF(ISERROR(VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE)),
  IF(ISERROR(VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE)),
  "未登録",VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE)),
  VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE)),
  VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE))

 数式バーに左横に=かfxって記号があると思うので、それをクリックすると数式の編集画面が出ます。
 そこで、数式バーの任意の位置をクリックすると、関数の意味やら引数の意味やら簡単に教えてくれるので、
 数式のチェックができます。

 そこを見るとわかるかと思うんですが、ISERROR(数式)はTRUEかFALSEを返すので、=0 だと
FALSEになっちゃうようです。なので、未登録が常に出てくるんではないでしょうか〜

 怪しげな解説だけではなんなので…こんな方法でも〜
 =IF(COUNTIF(シート2!$A$1:$A$1000,$A1),VLOOKUP($A1,シート2!$A$1:$B$10000,2,FALSE),
 IF(COUNTIF(シート3!$A$1:$A$1000,$A1),VLOOKUP($A1,シート3!$A$1:$B$10000,2,FALSE),
 IF(COUNTIF(シート4!$A$1:$A$1000,$A1),VLOOKUP($A1,シート4!$A$1:$B$10000,2,FALSE),"未登録")))
 (かなれっと) ☆当方Excel2000で確認。

 かなれっと様ありがとうございます。
chao様作成の=0なしタイプだと、
『この関数に対して、多すぎる引数が入力されています。』
と言われてしまい、その他にアレンジもきかせられず、使えませんでした。
かなれっと様作成の数式で、やりたいことが完璧に!!出来ました。
chao様、かなれっと様ありがとうございました。

 Thanks ☆☆** v(o^▽^o)v**☆☆ Thanks

 数式の編集画面で、ISERROR(数式)の説明を見てもよくわからなかったのですが、
かなれっと様の説明で、納得できました。
ただ、COUNTIFって個数を返すものですよね?
なぜ、IF式の論理式のところに入れられたのが不思議です・・・?
(のんきち)

 あ、やっぱり^^;
 COUNTIFでなんで〜?というのは実は私もわからなかったのですが、こちらのスレッドで(代奈)さんに教えていただきました。
[[20050912134040]]『答えを空欄にしたい』(あお) 
 COUNTIFの結果がある =TRUE、ない =FALSE、ということのようです。
 (かなれっと) 
 ☆ISERRORの式は、カッコの位置なのかしら…? ちょっと多かったようなので、
    こっそり減らしたんですが、、検証は…時間のあるときに^^;

 IF関数の「論理式」は基本的に論理値でなければならないと思いますが、
「論理式」の部分に数値が返る場合は
0を FALSE 、それ以外の数値を TRUE と「みなす」内部処理が行われている
と推測します。
 
逆に数値化すると
=N(TRUE)    =1
=N(FALSE)   =0
 
ちなみにVBEブール型変数のヘルプには下記のように書かれています。
//////////////////////////////////////////////////////////////////////////
他の数値型をブール型の値に変換すると、0 は偽 (False) になり、0 以外の値は
すべて真 (True) になります。一方、ブール型の値を他のデータ型に変換すると、
偽 (False) は 0、真 (True) は -1 になります。
//////////////////////////////////////////////////////////////////////////
 
VBAではTrueを数値化すると-1になるので、ワークシートでの数値化仕様と混同して
えらい目にあったことが。気をつけましょう。
(みやほりん)(-_∂)b


 かなれっと様、COUNTIFとISERRORの式はTRUEとFALSEが逆だということですかね?
ISERRORの数式のカッコを検証してみたのですが、
数も位置も一応私がアレンジしたもので問題なかったのですが
ネストが多かったのですかね?
もしお時間ございましたらまたご教授ください。

 みやほりん様、レスありがとうございます。
 >逆に数値化すると
以下からさっぱり意味がわかりません(汗)
VBAってマクロの記録くらいでしか使ったことないのですが、
奥が深いですね。
ひとつ教えていただきたいのですが、
論理値と数値の違いは
A1(セル名)と10(COUNTIFで返された値)の違いということですか?
(のんきち)ちょっと推敲

 >A1(セル名)と10(COUNTIFで返された値)の違いということですか?
違うと思いますよ。
 
論理値 (基本的に)論理式の結果の値
    論理式とはぶっちゃけ、「ウソかホントウか」を判断する式。
    B1に=A1=5 という式を入力します。
    A1が 5 なら TRUE(ホントウ)
    A1が 5以外ならFALSE(ウソ) がそれぞれセルに表示されます。
 
この TRUE/FALSE がIF関数の「論理式」の部分で必要。
 
たとえば、A列で数値5が一個でもあれば"○"を表示しなさい、という場合は
=IF(COUNTIF(A:A,5)>0,"○","")
 
COUNTIF(A:A,5)>0 はA列の5の数値の数によって TRUE か FALSE が返ります。
ところが、次のように書いても結果は同じです。
=IF(COUNTIF(A:A,5),"○","")
COUNTIF(A:A,5)の結果は数値であって論理値ではありませんが・・・
 
helpにはこうあります。
//////////////////////////////////////////////////////////////////////////
IF(論理式,真の場合,偽の場合)
論理式      真または偽のどちらかに評価できる値または式を指定します。
//////////////////////////////////////////////////////////////////////////
 
つまり、0は「偽として評価できる値」、0以外の数値は「真として評価できる値」
とされている、ということです。明言はありませんが。
 
「ある、ない」を判断する、というイミでは本来は「>0」を書くべきです。
ですが、数値が論理値として「みなされること」、また、
「>0」の分、数式が短くなるとの理由で後者を採用する人がいる、ということです。
 
 
【余談:論理値の数値化】
>逆に数値化すると
の以下は余談でした。混乱させて申し訳ない。
FALSEは0に、TRUEは1に変換できますよ、とそれだけです。
以下も余談。
同じ処理をIF関数を使わずに次のように書くこともできます。
=REPT("○",N(COUNTIF(A:A,5)>0))
REPT関数は「文字列を?回繰り返す」という関数です。0回なら""。
数式のお遊びです。お気になさらずに。
 
 
【さらに余談】
=TRUE=0 も =FALSE=0 も常に FALSE。 だから
ISERROR(VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE))=0
とかくと常にFALSE。
「ISERRORがFALSEのとき(VLOOKUPがエラーでないとき)」としたかったようですが、
残念ながら FALSE は 0 とはみなされません。
COUNTIFの0がIF関数の中でFALSEとみなされるのとは区別すべきです。
 
IF(ISERROR(VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE))=FALSE,
VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE)),IF(・・・・
「[VLOOKUPがエラーであるという命題が偽である]という命題が真であればVLOOKUPを計算しなさい、偽のときは・・・」
という書き方ならできたかもしれません。が、書いているほうがわけがわからなくなります。
(みやほりん)(-_∂)b

 みやほりんさま
解説ありがとうございました。
不用意な回答で混乱させてしまいました。
学校ではいろいろと学ばせていただいておりますが、大変勉強になっています。
ブール型の変数0はFALSEであると考えていたのですが、甘かったようです。
(chao)

 家事の合間にちょこちょこと書いてたら…
 みやほりんさんのしっかりした説明があるので、かなれっとのは省略とさせていただきます^^;
 う〜ん、面白い^^ そして、勉強になります♪ ありがとうございました m(_ _)m
 (かなれっと)


 みやほりん様、朝から何10回と読み直して、ようやく理解し始めました^^;
IF(ISERROR(VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE))=0
と
IF(ISERROR(VLOOKUP(!$A1,シート2!$A$1:$B$10000,2,FALSE))=FALSE
は、違うものなんですね。(時間かけてそこまでかよっ--;)
chao様、最初に雛形を作っていただいたので、頭の整理が出来てすごく助かりました。
かなれっと様、お忙しいところ数式考えていただいてありがとうございました。
皆様ありがとうございました。
私も精進して頑張ります。
(のんきち)

 かえって難しい説明をしてしまったかも(汗
VBEのヘルプの
 
//////////////////////////////////////////////////////////////////////////
他の数値型をブール型の値に変換すると、0 は偽 (False) になり、0 以外の値は
すべて真 (True) になります。
//////////////////////////////////////////////////////////////////////////
 
と、IF関数のヘルプの
 
//////////////////////////////////////////////////////////////////////////
IF(論理式,真の場合,偽の場合)
論理式      真または偽のどちらかに評価できる値または式を指定します。
//////////////////////////////////////////////////////////////////////////
 
この二つを「状況証拠として」・・・・
IF関数の「論理式」の部分では数値(を返す数式も含めて)を引数に指定すれば
必ずしも TRUE/FALSE でなくても良いですよ、
 
ただし、「FALSEの替わりとしての0」といつもは考えちゃダメよ、
といいたかったのです。
(みやほりん)(-_∂)b

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.