[[20070803193741]] 『ひとつのマスに複数の計算式を入れる場合』(つばめ) ページの最後に飛ぶ

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

 

『ひとつのマスに複数の計算式を入れる場合』(つばめ)

見積書を作る段階で仕切り金額を粗利と掛率どちらかに数値を入れれば計算できるようにしたいのですがどうでしょうか?具体的にはこうです。

金額   原価   粗利   掛率   貴社仕切

A      B      C      D      E

粗利で計算する場合・・・
A×D=E

掛率で計算する場合・・・
B÷(1-C)=E

の計算をEのひとつのマスにまとめたいのです。なにもいれてない場合は空欄で収めたいです。よろしくお願いします。IF関数でよろしいんでしょうか?


 > IF関数でよろしいんでしょうか?
 IF関数でよいと思いますけど、不都合がありますか? (Hatch)


 例えば、「A1が空欄でないか?」を確認したい時
 「A1<>""」と言う書き方をします。

 どのIF関数から作って行っても良いと思いますが
 例えば↓の様に考えてみるのはどうでしょう。

 IF(条件  :Cが空欄でないか?
   真の時:B÷(1-C)「Cが空欄でない時」
   偽の時:ここは 「Cが空欄の時」
       更にIF関数を使って
       IF(条件  :Dが空欄でないか?
         真の時:A×D 「Dが空欄でない時」
         偽の時:空欄 「Dが空欄の時」  ))

 全体的な式の形としては
                 IF(__2__,__真__,__偽__)
 IF(条件1,真の時,IF(条件2,真の時,偽の時))
 IF(--1--,--真--,-----------偽----------)

 IF関数の中に、IF関数が入った形になります。

 (HANA)


 よく解りませんが、もし、粗利でなく値入率なら、そして
 CとDに計算式が入ってないなら
 =IF(AND(A1="",B1=""),"",IF(A1<>"",A1*C1,IF(B1<>"",(B1/D1)*C1)))
                          (自信無し)

HANAさんできました!ありがとうございます。
お二人とも私のわかりにくい説明でありがとうございました。

 つばめさんから「解決済み」報告がありますので
 (自信無し)さんのお名前がその通りだとして
 少しレスをつけておきます。

 自信無しさんの方法でも、求める結果が得られます。
 ただ、もう少しIF関数の中にIF関数を入れたときの
 「真の時」「偽の時」がどの様な物か
 じっくり考えて見られても良い様な気がします。

 IF関数は、上でも書きましたが
IF(論理式,真の場合,偽の場合)
 と言う書き方をします。
 そして、自信無しさんの式の内 一番内側に有る
 IF関数の部分だけを取り出すと
>IF(B1<>"",(B1/D1)*C1)
  IF(-条件-,----真----) 「偽の時」の設定がなされて居りません。
 式全体で見ると、このIF関数が「偽」になることはあり得ないので
 求める結果は得られます。

 何故「偽」になることがあり得ないのか を考えてみると
  [1] AND(A1="",B1="")が「偽」→どちらか片方には数値が有る
  [2] A1<>""     が「偽」
     「A1が空欄でない が「偽」」つまりA1が空欄である
    [1]の条件判断により、どちらか片方には数値がある中で
   A1が空欄 と言う事は、B1には数値がある のです。
    よってその中にある
   [3]B1<>""は、必ず「真」になります。
  これは、IF関数を使うまでもない事です。

 例えば、A1セルに「A」「B」どちらかの値が必ず入ります。
 空欄になることは有りません。
 この時、「A」なら「あ」・「B」なら「い」をB1セルに返す
 と言うIF関数を作るなら
=IF(A1="A","あ","い")
 ですよね?
 どちらかの値が必ず入り、それがAでないなら、Bなのですから。
 もしも
=IF(A1="A","あ",IF(A1="B","い"))
 となっていたら、違和感を感じませんか?

  ちなみに「空欄になることは有りません。」の条件を無視して
  A1セルが空欄になってしまった場合、前の式では「い」
  後の式では「FALSE」と表示されます。

 一番にAND(A1="",B1="")を確認するので有れば
 式はもう少し短く
=IF(AND(A1="",B1=""),"",IF(A1<>"",A1*C1,(B1/D1)*C1))
 この様にかけます。
 また、私が上で説明した順番で式をつくると
=IF(A1<>"",A1*C1,IF(B1<>"",(B1/D1)*C1,""))
 になります。
  [1]A1が空欄でないが偽 → A1が空欄
  さらに
  [2]B1が空欄でないが偽 → B1が空欄
  とは、「A1,B1共に空欄」ですので2番目のIF関数の
 偽の時を「""」としておきます。

 (HANA)

 (HANA)さん、解り易い解説勉強になりました。
 =IF(ISBLANK(A1),"",IF(A1<>"",A1*C1,IF(B1<>"",(B1/D1)*C1,"")))
 として
 C1 =IF(ISBLANK(A1),"",(A1-B1)/A1)
 D1 =IF(ISBLANK(A1),"",B1/A1)とすれば、エラー回避はできますが
 (B1は処理しなくても結果は100%ででるのでしていません)
 これで合ってます?    (自信無し)

 (HANA)さん、解り易い解説勉強になりました。
 =IF(ISBLANK(A1),"",IF(A1<>"",A1*C1,IF(B1<>"",(B1/D1)*C1,"")))
 として
 C1 =IF(ISBLANK(A1),"",(A1-B1)/A1)
 D1 =IF(ISBLANK(A1),"",B1/A1)とすれば、エラー回避はできますが
 (B1は処理しなくても結果は100%ででるのでしていません)
 これで合ってます?    (自信無し)

 セル番地の違いが気になっては居たのですが・・・
>=IF(ISBLANK(A1),"",IF(A1<>"",A1*C1,IF(B1<>"",(B1/D1)*C1,"")))
 この式は、何処へ入力し、何を求めるものですかね?

 私は つばめ さんのご質問を
 「A1に 金額。B1に 原価 を入力して於いて
  C1に数値が入ったら B1÷(1-C1)
  D1に数値が入ったら A1×D1
  の結果をE1に表示させたい。
  ただし、C1,D1共に未入力の場合は 空欄。」
 と受け止めて、E1に入れる式を検討 しているのですが・・・
 今さらながら、A1やB1が空欄かどうかを確認しているのは
 どうしてなのですかね?
 以下を読んで、私がどうも思い違いをしている様で有れば
 どんな時に何処へ入れ、何が求まる式なのか 教えてください。

 自信無し さんの直上の書き込みの内、
 >C1 =IF(ISBLANK(A1),"",(A1-B1)/A1)
 以降の3行が、何を仰りたいのか良く分からないのです・・・。

 とりあえず、一番最初の式を言葉に置き換えてみます
 IF関数をイレコにする時の注意点は
  [1]2番目以降に入っているIF関数は、その条件の中に入っていなくても
   それ以前の条件の真か偽を満たしている。
  [2]条件は、最初から判定されていき、真になればその時点で
   そのIF関数の「真の時」を返し、それ以降のIF関数は計算されない。

  【例】=IF(A1="","",IF(B1="あ","イ","ロ"))
    『A1が空欄なら空欄、
       A1が空欄でなくB1が「あ」なら「イ」
           ~~~~~~~~~~~~~~B1がそれ以外で「ロ」』と言う式ですが
    2行目の下線部分が[1]の注意点です。
      もしも「ロ」の部分に更に、IF関数を入れた場合
      条件に含めなくても「A1が空欄でなく、B1が「あ」でない」
      と言う条件が満たされています。
    ≪この部分が分からなければ、その様に仰ってくださいね。
     もう少し、詳しく例を挙げようと思いますので。≫
    A1が空欄の場合は、B1に何が入っていても空欄です。
     これが[2]の注意点ですが、この式では問題なく受け入れ
     られると思います。

 と言う事です。コレをふまえて・・・。

 IF(条件  :ISBLANK(A1),
   真の時:"",
   偽の時:IF(条件  :A1<>"",
          真の時:A1*C1,
          偽の時:IF(条件  :B1<>"",
                真の時:(B1/D1)*C1,
                偽の時:"")))
 IF(条件  :A1が空欄か?
   真の時:空欄
   偽の時:IF(条件  :A1が空欄でないか?
          真の時:A1*C1
          偽の時:IF(条件  :B1が空欄でないか?
                真の時:(B1/D1)*C1
                偽の時:空欄       )))
 [1]についてですが
 最初のIF関数で「A1が空欄か?」を調べていますが それが「偽」と言う事は
 「A1が空欄でない」のです。
 つまり、2番目のIF関数の条件「A1が空欄でないか?」は常に「真」です。
 なぜなら、その前のIF関数で、A1が空欄の物は既にふるいにかけられて
 残っていないのですから。

 例えば、勝ち抜きじゃんけんをしたとしますよね。(アイコも負け)
 3回戦行った後に、残っている人に「3回とも勝った人」と問いかけるのは
 ナンセンスですよね?1回でも負けた人は、残っていないのですから。
 「A1が空欄でない」しか残っていない状態で「A1が空欄でないか?」と言う
 IF関数を作るのは、ナンセンスだと思いませんか?

 [2]については
 おそらく、A1かB1に数値が入力され、入力された方を判断し
 それに沿った数式を計算する と言う式を作ろうとなさっていると思います。
 最初に「A1が空欄なら空欄」と指示を出してしまうと
 B1に何が入っていても、A1が空欄なら空欄 です。
 2番目以降のIF関数は計算されないのです。

 3番目のIF関数で「B1に値が入力されている時の動き」を書いて有りますが
 最初のIF関数で真が出てしまうので、次へ進みません。 

 また、[1]を考えると3番目のIF関数へ行き着くためには
  1.「A1が空欄か?」が偽   →A1が空欄でない
  2.「A1が空欄でないか?」が偽→A1が空欄である
 二つを共に満たした時 です。
 お分かりのように、同時に二つは満たせませんので、
 やはり3番目のIF関数が発動することは有りません。
(モチロン、[1]をクリアしただけでは[2]があるので
 計算されませんが・・・。)

 イレコにした関数を考えるとき、式は一つずつ作るのですが
 入れる順番を考えて、何処でどんなことをやりたいのか考えながら
 順番に作っていくのが良いと思います。
 また、条件は一番範囲の狭い物から確認していく必要が有ります。

 例えば
 =IF(ISBLANK(A1),"",A1*C1)
 この式は、A1が空欄でない時「A1*C1」ですよね?
 A1が空欄だったとき→結果が「""」となったときに何がしたいのか?
 と考えると
 『B1が空欄でないかを確認し、空欄の場合は「""」
  空欄でない場合は「(B1/D1)*C1」』式にすると
 =IF(ISBLANK(B1),"",(B1/D1)*C1)
 重複しますが、この計算をしたいのは、
 >>=IF(ISBLANK(A1),"",A1*C1) この式で
 >>A1が空欄だったとき→結果が「""」となったとき
 ですので、「""」の部分に入れ込みます。
                IF(___________,__,__________)
=IF(ISBLANK(A1),IF(ISBLANK(B1),"",(B1/D1)*C1),A1*C1)
 IF(-----------,------元はココが「""」-------,-----)

 この式を言葉にしてみますと
 IF(条件  :ISBLANK(A1),
   真の時:IF(条件  :ISBLANK(B1),
          真の時:"",
          偽の時:(B1/D1)*C1),
   偽の時:A1*C1)

 IF(条件  :A1が空欄か?
   真の時:IF(条件  :B1が空欄か?
          真の時:空欄
          偽の時:(B1/D1)*C1)
   偽の時:A1*C1)

 A1が空欄の場合、更にB1も空欄かどうか確認します。
   B1も空欄なら、空欄とし(「共に空欄」と言う事なので)
   B1が空欄でなければ、「(B1/D1)*C1」を計算します。
 (「A1が空欄、B1が空欄でない」ので)
 そもそも、A1が空欄でないなら「A1*C1」を計算します。
(「B1はどうなっているか分かりませんが、とにかくA1が空欄でない。
  数字が入っていれば計算すればよい」ので)

 ・・・長くなりましたが、いまいちすっきりしない部分が
 分かりそうですかね?

 (HANA)

 (HANA)さん よく解りました、ありがとうございます。
 なんとなく、つばめさんが、そのうち"C"と"D"に計算式を入れてと
 勝手に想像、でも、結局私の勉強になりました 
イレコにした関数を考えるとき、式は一つずつ作るのですが
 入れる順番を考えて、何処でどんなことをやりたいのか考えながら
 順番に作っていくのが良いと思います      ですね!(自信無し)

コメント返信:

[ 一覧(最新更新順) ]


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