- ベストアンサー
IF関数の論理式が作れない
・在庫(シート) A B C 1 品物 在庫数 2 りんご 4 3 みかん 4 4 ぶどう 4 ・出荷(シート) A B C D 1 品物 在庫数 出荷数 残 2 りんご =在庫!B2 2 =B2-C2 在庫シートのC2にも、「残」数を載せたいのですが、式の作り方が分かりません。 VLOOKUPを使ってみようと思いましたが、なかなか思うようにいきません。 出荷シートのA列の商品が、在庫シートのA列にもあった場合(この場合は「りんご」)は、出荷シートのD列の数値を返す。 無かった場合(この場合は「みかん」「ぶどう」)は、在庫シートのB列の数値を返す。 IFの真偽は作れましたが、最初の論理式作りで手間取っています。 =IF( ,VLOOKUP(A2,出荷!A:D,1,0),B2) ↑この部分の論理式が不明です。 尚、在庫シートのB2には既に在庫数が載ってるのに、更に在庫数を載せるのか?と疑問を感じられると思いますが、その疑問は、申し訳有りませんが、指摘しないで下さい。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
有無のチェックはLOOKUP関数でも出来ますが、通常はMATCH関数を使います。 で、LOOKUPにせよMATCHにせよ、「相手がない」とエラーしますので、 エラー評価関数ISERRORと組み合わせて使います。 =IF(ISERROR(MATCH(A2,出荷!A:A,0)),B2,VLOOKUP(A2,出荷!A:D,4,FALSE)) こんな感じでいいんじゃないかと。 動作はチェックしてないので、微妙に合ってなければすいません。
その他の回答 (6)
- hallo-2007
- ベストアンサー率41% (888/2115)
IF文、或いは検索値の有無のチェックについては既に回答でていますのでよろしいかと思いますが、 質問が在庫管理の手法ということでしたら、あえてシートの構成について 出荷シートで A B C D 1 品物 在庫数 出荷数 残 2 りんご =在庫!B2 2 =B2-C2 3 りんご と、2度目のりんごの出荷の場合はどうされますか? 一般的で紹介すると A B C D 1 日付 品物 出荷数 残 2 2007/3/31 りんご -4 3 2007/3/31 みかん -4 4 2007/3/31 ぶどう -4 5 2007/4/1 りんご 2 D2セルに =SUMIF(B2:B$2,B2,C2:C$2)*-1 下フィルしてみてください。 B5セルに りんご といれると りんごの在庫数が出ますし 出荷数入れると 出荷後の在庫になると思います。 別途、在庫マスターのシートがあれば りんご みかん ぶどう と品名あって B2セルには、=SUMIF(出荷!B:B,B2,出荷!C:C)*-1 など入れておきます。 年度末など、定期的な在庫数を記録しておきたいときは、 在庫シートのB列をコピィ、形式を指定して貼り付け、値にチェックして隣にでも貼り付けておきます。 参考になれば幸いですが、的外れであれば、読み飛ばしてください。
お礼
>的外れであれば いえ、とてもありがたい回答です。 今回は、『論理式作成』を質問したかった為、すっごいシンプルな表で質問させていただきましたが、 作るデータの質が違えば、hallo-2007さんの仰るような事が求められるでしょう。 今回のとは別に、マスタ管理表の似たようなAccessファイルがあるので、hallo-2007さんが教えてくださった管理で式を応用して管理ファイルを作ってみます。 Accessで作ったは良いが、インストールされているPCが少なくて困っていたので、Excelに移行させる良い機会かもしれません。 詳細な説明を頂き、大いに役立てる自信がつきました。 ありがとうございました。
- mshr1962
- ベストアンサー率39% (7417/18945)
同じ商品が複数行に重複しない場合 出荷シート!B2の数式は =IF(ISNA(VLOOKUP(A2,在庫!A:B,2,0)),0,VLOOKUP(A2,在庫!A:B,2,0)) または =IF(COUNTIF(在庫!A:A,A2)=0,0,VLOOKUP(A2,在庫!A:B,2,0)) 在庫シート!C2の数式は =IF(ISNA(VLOOKUP(A2,出荷!A:D,4,0)),0,VLOOKUP(A2,出荷!A:D,4,0)) または =IF(COUNTIF(出荷!A:A,A2)=0,0,VLOOKUP(A2,出荷!A:D,4,0)) 同じ商品が複数行に重複しない場合 出荷シート!B2の数式は =SUMIF(在庫!A:A,A2,在庫!B:B)-SUMIF(A$1:A1,A2,C$1:C1) 在庫シート!C2の数式は =MAX(SUMIF(A$2:A2,A2,B$2:B2)-SUMIF(出荷!A:A,A2,出荷!C:C),0)
お礼
おお!これはすごい! ISNA?使った事の無い関数で驚きましたが、この関数が持つ役割がわかると、なるほど!こういう使い方もあるのだと分かりました。 MAX関数も、この式では、自分の中では出ようがありませんでしたが、使い方の視点を変えれば、とても効率の良い式になるのですね。 早速式を入れ込んでみました。 式の答えは同じでも、方々によって、考え方と式の作り方が全く違うので、式作りの勉強と多様性も勉強になります。 『重複』については、重複データをわざと作って、実践したいと思います。 ありがとうございました。
- kourinoa
- ベストアンサー率0% (0/2)
VLOOKUP関数を使用する場合は、 =IF(ISERROR(VLOOKUP(A2,出荷!A:A,1,0))=TRUE,B2,VLOOKUP(A2,出荷!A:D,4,0)) これで大丈夫だとおもいます。 ちなみにご存知だと思いますが、 VLOOKUP関数を使用する場合、在庫シートは、品物で昇順に 並んでいる必要があります。
お礼
やはり、方々はISERROR関数を推されますね。 実際に今、式を作っていますが、ISERROR関数が有ると、式が作りやすくなりますね。 エラー値の場合に活躍してくれる貴重な関数ですが、使ってないと存在を忘れますね^^; >VLOOKUP関数を使用する場合、在庫シートは、品物で昇順に並んでいる必要があります。 そちらは存じております。ご忠告、ありがとうございました。
- mu2011
- ベストアンサー率38% (1910/4994)
次の様な感じでしょうか。 =IF(COUNTIF(出荷!A:A,A2),VLOOKUP(A2,出荷!A:D,4,FALSE),B2)
お礼
式を載せてくださってありがとうございます。 COUNTIFですか。存在を忘れていました。 探す=VLOOKUPというの考え方がありました。 カウントしてくるっていうのが本意ですよね。 ありがとうございました。
- higekuman
- ベストアンサー率19% (195/979)
> 出荷シートのA列の商品が、在庫シートのA列にもあった場合 この考え方を逆にして「在庫シートのA列の商品が、出荷シートのA列にもあった場合」と考えて見ましょう。 vlookup関数の最後の引数を0にすると、一致するものがない場合はエラーになるので、iserror関数でエラーかどうかを判断=一致するものはあるかどうかを判断できます。
お礼
>iserror関数 昔使った記憶があります。 視点を、出荷シートから在庫シートに切り替えるだけで、式が頭の中にイメージできました。 考え方がを一方だけに偏ってしまうと、式って思い浮かばないものですね。 VLOOKUPで始末しようとした自分も、頭固いですね。 ありがとうございました。
- kickknock
- ベストアンサー率31% (207/661)
IF関数はネストが14回ぐらいまで、可能な関数です。(詳細はもう忘れました。) 簡単に言えば、(0か1か)を14回程度繰り返すことが出来ます。 一回で処理しようとしないで、ネストで条件を設定していって、 在庫がある場合 で、数量が1以上 で、5個以下 の時 で、ネスト三回です。 ネストの繋げ方については、本を参照になさってください。
お礼
なるほど! 考え方を変えれば良いんですね。 ネストを繋ぐ操作は出来ますのでやってみます。 ありがとうございました。
お礼
ISERRORとMATCHの組み合わせとは、思いつきませんでした。 確かに、MATCHは検査値として多様していますが、この式に使う発想がありませんでした。 別の用途でしか使ってこなかったMATCHが、こういう時にも使えると知ってよかったです。 ありがとうございました。