• ベストアンサー

エクセル関数 予算を割り切れない比率で分配するには

102円を25%、31%、44%で分配しなければならない時に使える関数はありますか? これを手計算でする場合は次のようにしています。 102円の25%=25.50 (A)      31%=31.62 (B)      44%=44.88 (C) 【手順1】 それぞれの小数点以下を比較し、一番大きい(C)を切り上げる。(A)(B)は切捨てて合計を出してみる。  (A)ROUNDDOWN →25.00円  (B)ROUNDDOWN →31.00円  (C)ROUNDUP   →45.00円 合計が101円となり、予算に一致しないので【手順2】へすすむ。 【手順2】 小数点以下が二番目に大きい(B)も切り上げる。(A)は切捨てて合計を出してみる。  (A)ROUNDDOWN →25.00円  (B)ROUNDUP   →32.00円  (C)ROUNDUP   →45.00円 合計が102円となり、予算と一致。手計算終了! 以上のことを簡単な関数を使って算出する方法がありましたら是非教えて下さい。このような分配結果を得られれば、必ずしも手計算の過程を踏まなくてもいいです。よろしくお願いいたします。

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

  • ベストアンサー
  • tascany
  • ベストアンサー率48% (15/31)
回答No.4

#1です。 たびたび失礼します。 さて、四つ以上に分配する場合にも妥当するこたえがわかったので、書いておきます。 こっちのほうが簡単です。 A1に102円、 B列に25%(B1)、31%(B2)、44%(B3)、 C列に上から25.50、31.62、44.88とあるとします。 1)D1に「=C1-INT(C1)」を貼り付けてD3までコピペ。 2)D1からD3のSUMをD4に。 2)E1に 「=IF(RANK(D1,D$1:D$3)-0.5<D$4,ROUNDUP(C1,0),ROUNDDOWN(C1,0))」 を貼り付けてE3までコピペ。 ※小数点以下の合計が2なら、大きい方から二つ(RANKの値が1と2のもの)切り上げて、あとは切り捨てればすむことですね。この考え方だと、分配する数をいくらでも増やせます。

shinomis
質問者

お礼

ありがとうございました!!

その他の回答 (4)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

こんにちは。maruru01です。 データがA1にあり、B1~に分配率を「25%」(=0.25)のように入力するとします。 C1に、 =IF(SUMPRODUCT((MOD($B$1:$B$4*$A$1,1)>MOD(B1*$A$1,1))*1)+SUMPRODUCT((MOD($B$1:B1*$A$1,1)=MOD(B1*$A$1,1))*1)-1<SUMPRODUCT($B$1:$B$4*$A$1)-SUMPRODUCT(INT($B$1:$B$4*$A$1)),ROUNDUP(B1*$A$1,),ROUNDDOWN(B1*$A$1,)) と入力して、下の行へコピーします。 この数式ではB1:B4の4つの分配の例になります。 分配数によって、数式中の「$B$4」を変更して下さい。 また、分配率が同じ場合は、上の行を優先的に切り上げます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

分配するユーザー定義関数を作ってみました。 以下をVBEで標準モジュールに貼り付けて下さい 'value:分配元値、a:分配する比率の配列、n:その何番目 '結果は小数部分が大きいモノから分配する Public Function 分配(v, a As Variant, Optional n = 1) Dim sum, i Dim b(), c() ReDim b(LBound(a) To UBound(a)) ReDim c(LBound(a) To UBound(a)) sum = Application.WorksheetFunction.sum(a) For i = LBound(a) To UBound(a) a(i) = a(i) / sum '比率に変える b(i) = Fix(v * a(i)) '端数を捨てる c(i) = v * a(i) - b(i) '端数を取っておく Next Do While Application.WorksheetFunction.sum(b) <> v '修正した値がトータルに等しくならない i = Application.WorksheetFunction.Match(Application.WorksheetFunction.Max(c), c, 0) '小数部分が一番大きい b(i) = b(i) + 1 c(i) = 0 Loop 分配 = b(n) End Function 使い方 =分配(分配する元の数値またはセル,{分配する比率},取り出す値の順番) 例 A1が102の時 =分配($A$1,{25,31,44},ROW(A1)) にして下にコピー あるいは、直接 =分配(102,{25,31,44},1) =分配(102,{25,31,44},2) =分配(102,{25,31,44},3) {25,31,44}は、25:31:44の意。

shinomis
質問者

お礼

ご回答、ありがとうございました!初心者の私には少々難しく感じましたが、とりあえず貼り付けてやってみます。私ももうちょっと勉強しなくては・・・ありがとうございました!

  • tascany
  • ベストアンサー率48% (15/31)
回答No.2

#1です。 訂正を・・・。 「=CHOOSE(RANK(D1,D1:D3),ROUNDUP(C1,0),ROUND(C1,0),ROUNDDOWN(C1,0))」 ではなく、 「=CHOOSE(RANK(D1,D$1:D$3),ROUNDUP(C1,0),ROUND(C1,0),ROUNDDOWN(C1,0))」 でした。 失礼しました。

  • tascany
  • ベストアンサー率48% (15/31)
回答No.1

おもしろい問題ですね。 で、三つに分配する場合についてしか通用しない考え方ですが、それでよければ・・・いかがでしょうか。 A1に102円、 B列に25%(B1)、31%(B2)、44%(B3)、 C列に上から25.50、31.62、44.88とあるとします。 1)D1に「=C1-INT(C1)」を貼り付けてD3までコピペ。 2)E1に「=CHOOSE(RANK(D1,D1:D3),ROUNDUP(C1,0),ROUND(C1,0),ROUNDDOWN(C1,0))」を貼り付けてE3までコピペ。 ※整数点以下が一番大きいものを切り上げ、二番目は四捨五入、三番目は切り捨て。何故これで予算と一致することになるかというと・・・・、 (三つに分配した場合)整数点以下の合計は、1,2のいずれかなんですけど(簡単のため0は無視)、合計2になるにもかかわらず、二番目に大きいものが四捨五入・切り捨てになるということはありえません。というのも、もし二番目に大きなものが0.5未満だとすると、それより小さな三番目の数との和は1未満になる、したがって、それらと一番目の数との和も2未満になるはず(背理)、だから。

shinomis
質問者

お礼

分かりやすくご説明していただき、ありがとうございます!この後のご回答もあわせてとても参考になりました。

関連するQ&A

  • 小数点4桁での四捨五入がうまくいきません

    エクセルで次のような計算をさせます。 A2 に1.8、B2に0.075、C2に0.075、 D2に= A2*B2*C2 、E2に=roundup(D2,4) D2の計算結果は 0.010125 です。小数点第5桁目の値を参照して第4桁目で四捨五入したいのですが、roundupでは0.0102、rounddownでは0.0101です。 表示させたいのは0.0101です。この場合、rounddownを使えば問題ないのですが、逆にrounddownだと小数点以下4桁目の四捨五入がうまくいかない場合もあります。 例えば A3に2.7 B3に0.08、C3に0.08 があり、E3にすべての値を掛けた結果を表示させると0.01728となります。 =roundup(E3,4)では0.0173となり、rounddownでは0.0172となります。この場合はroundup関数の結果である0.0173が求める数値です。 A列、B列,C列に任意の数字が入り、E列に4桁目で四捨五入した正確な値を求めたいのですが、なにか良い方法はないでしょうか。 VBAを使っても構いません。ちなみにこれは木材の材積計算に使用する目的です。 よろしくお願いします。

  • エクセルの計算について質問です

    エクセルの計算について質問です 数値の計算で、電卓で算出した値とエクセルで計算した値とが異なり困ってます。 【計算内容】 A(整数) × B(小数部2桁) = C(整数) ※Cは小数点以下切捨てとしたい ※エクセル計算ではROUNDDOWNを使用 【実際の計算結果】 (1)10,000,010,000.00 × 9999.99 = エクセル:99,999,999,999,999、電卓:99,999,999,999,999 (2)10,000,010,000.01 × 9999.99 = エクセル:100,000,000,000,000、電卓:99,999,999,999,999.9999 (1)は電卓とエクセルで結果は一致しますが、(2)は一致しません。 エクセルで小数点以下第4位が丸められてるようです。 【エクセルで算出したい値】 (2)ではDに999,999,999,999と出力したいです。 関数INTやROUNDDOWNを使ってみたのですが、うまくいきませんでした。 セルCの書式設定と、どの関数を使用すればよいのか教えていただけると大変助かります。

  • EXCELで関数を2つ入力?

    例えば、C3に、 『=A1*B1』という関数が入ってます。 その答えを、小数点第3位繰り上げで表示させたいのです。 その場合は、ROUNDUP関数を使うと思うのですが、 上記関数と組み合わせ方が分かりません。。。 1つのセルに、関数を2つ入力すれば良いのでしょうか? その方法をご教授下さい。 また、『表示形式』で繰り上げは出来るのでしょうか? そのやり方がありましたら、よろしくお願いします。

  • Excelの関数(切捨て)の使い方

    ExcelのROUNDDOWN関数で、0.0から9.9までを、小数第1位で切捨てた結果を表にしました。対象となる数字を直値で入れると正しくなるのですが、0.0から0.1刻みで加算する算式で入力すると、6.0,7.0,8.0,9.0の切捨て結果が、それぞれ、5.0,6.0,7.0.8.0となってしまいます。関数の使い方がおかしいのでしょうか。作成した表が添付できなかったので、文章で説明すると、次の通りです。A1=0.0、A2=A1+0.1、A3=A2+0.1----、B1=ROUNDDOWN(A1,0)、B2=ROUNDDOWN(A2,0)、B3=ROUNDDOWN(A3,0)---です。Excelの関数に詳しい方、ご教示お願いします。

  • EXCELのROUNDDOWN関数について

    いつもお世話になります。 ROUNDDOWN関数で ROUNDDOWN(25/42*1.008,5)という計算式の計算結果が 0.600000となってしまいます。0.599999とならないのが なぜなのかわかりません。 またROUNDDOWN(25/32*1.007,5)では0.78671と小数点第6位が切り捨てられます。 アドバイス宜しくお願い致します。

  • Excelの関数で「マイナス値の切り上げ」のやり方をおしえてください

    Excelの数学関数で切り上げ(roundup)がありますが、計算結果がマイナスになるとき、絶対値で切り上げられてしまうため、実際にはマイナスが大きくなってしまいます。言っている意味はわかってくれますか? roundupの特性上しかたないのであれば、IF関数を利用して、 数値が0より大きいときはroundup 数値が0より小さいときはrounddown とすることも考えましたが、もっと簡単な関数がありそうな気がして仕方ありません。 知っている方がいたらぜひ教えてください。

  • エクセルのROUNDUP関数について

    お世話になります。 ExcelのROUNDUP関数についてアドバイスください。 【例】 C3のセルに =ROUNDUP(B3,5) このときB3の値が0.15678423 なら C3のセルは0.15679になる ここまでは何の問題もないのですが B3のセルが 0.1730909… のように小数点第6位の値が0のときも C3のセルが 0.17310 となります。 私としては小数点第6位の値が0のときだけは切り上げず C3のセルが 0.17309 と表示されるようにしたいのですがどうすればよいのでしょか。 いいかえるなら 第6位が1~9なら切り上げ、0のときだけ切り捨てという感じです。 なおセルの書式設定で小数点は第5位まで表示と設定しているので 0.17310 のように 0 が表示されますがこれについては問題ないです。 Excel2000使用です。

  • エクセルでの四捨五入関数に関しての質問です。

    エクセルの関数計算で悩んでいます。 A列にいろいろな数字が入っているとしてB列に計算結果を出したいのですが 1.数字の末尾が4以下の物は丸める。   11 → 10   12 → 10   101 → 100   123 → 120 2.数字の末尾が0や5の場合はそのまま。   10 → 10   30 → 30   500 → 500   15 → 15   45 → 45   1055 → 1055 3.末尾が6以上だったら9にする。   16 → 19   38 → 39   108 → 109   1237 → 1239 という計算式はできるのでしょうか。 一つ一つならROUNDUPやROUNDDOWNでできるのですが、 まとめてとなるとifと不等号が必要なのかなと漠然なことしか思い浮かびません。 よろしくお願いいたします。

  • エクセル関数で

    お世話になります。下記の数値の小数点以下3桁目をある条件で 切り上げ・切捨てを行いたいのですが、その条件に加えて小数点以下3桁 目が0でも切上げにする場合の数式を教えていただけないでしょうか? 【条件】23.230以下は、小数点以下3桁目を切り捨て。23.231以上は 小数点以下3桁目を切上げる。ただし、23.231以上で切上げる場合、 小数点以下3桁目が0の場合でも切上げる(*) 例)23.151 → 23.15   23.150 → 23.15   23.230 → 23.23   23.231 → 23.24 (*) 23.240 → 23.25 切り上げ、切捨ての数式はIF関数でできたのですが、23.231以上で 切上げる場合、小数点以下3桁目が0の場合でも切上げるというのが 分かりません、、、 =IF(A1>=23.231,ROUNDUP(A1,2),ROUNDDOWN(A1,2)) ご指導いただきたく、宜しくお願い致します。

  • セル参照によって関数を変更させたい

    Excel2010を使用しています。 「B列×A1セル」の計算でROUNDDOWN関数を使って切捨てをしているのですが、場合によって切捨てたい位が十の位であったり、百の位であったりとその都度変わるので「=ROUNDDOWN(B5*$A$1,$A$2)」として「A2」セルを参照させ、そこを「-2」「-3」などと変更するようにしています。 ところが切捨てだけではなく、切上げや四捨五入をするケースも出てきたのですが、同じようにセル参照を使って「ROUNDDOWN」を「ROUND」や「ROUNDUP」に変える事は可能でしょうか? 最初の行の関数を書き換えてドラッグでコピーをしたり、置換をしたりすれば良いのでしょうが、セルの値を変えることによって、関数を変えることは出来ないかと考えています。 宜しくお願い致します。

専門家に質問してみよう