『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