如何按每个单元格为整数的百分比分配总数,它们总和与原始总数完全相同?

时间:2011-12-30 22:28:07

标签: excel excel-vba excel-2010 vba

      Date
Nov-11     Dec-11
50         102

   Percent
0          0
0          34
34         33
33         33
33         0

  Apportion
0          0
0          35
17         34
16         34
16         0

     Sum
49         103

第一列的5个百分比对应于将50以上分割为分配标题下的5个单元格中的整数部分。结果来自一个简单的Round(x *%,0)。我希望下面的所有值与第一列中的50完全相加。这可以通过在Apportion部分中更改任意数量的非零值来实现。

如果可以用公式做到这一点,我无法弄清楚如何。我尝试的每件事都是循环参考。问题是任何一个百分比都可以是0,所以我不能只创建一个解释欠/溢出的桶。

如果需要更多信息,请与我们联系。这是我第一次问过SO的问题。我无法附上图片,所以我试图用代码绘制上面的表格。

2 个答案:

答案 0 :(得分:2)

这是实现目标的另一种方式。

这显示了工作表的外观,除了(1)列B和D将被隐藏,(2)值不会像我显示的那样左对齐。

     |A         |B         |C         |D         |
 1   |Date      |          |          |          |
 2   |Nov-11    |          |Dec-11    |          |
 3   |50        |          |102       |          |
 4   |          |          |          |          |
 5   |Percent   |          |Percent   |          |
 6   |0         |          |0         |          |
 7   |0         |          |34        |          |
 8   |34        |          |33        |          |
 9   |33        |          |33        |          |
10   |33        |          |0         |          |
11   |          |          |          |          |
12   |Apportion |          |Apportion |          | 
13   |0         |0.00      |0         |0.00      |
14   |0         |0.00      |35        |0.32      |
15   |17        |0.00      |33        |-0.66     |
16   |17        |0.50      |34        |0.34      |
17   |16        |          |0         |          |
18   |          |          |          |          |
19   |Sum       |          |Sum       |          |
20   |          |          |          |          |
21   |50        |          |102       |          |

以下单元格包含显示的公式:

A13  =ROUND(IF(A6=0,0,A$3*A6/100)-B12,0)
A14  =ROUND(IF(A7=0,0,A$3*A7/100)-B13,0)
A15  =ROUND(IF(A8=0,0,A$3*A8/100)-B14,0)
A16  =ROUND(IF(A9=0,0,A$3*A9/100)-B15,0)
A17  =ROUND(IF(A10=0,0,A$3*A10/100)-B16,0)
A21  =SUM(A13:A17)
B13  =A13-IF(A6=0,0,A$3*A6/100)
B14  =A14-IF(A7=0,0,A$3*A7/100)
B15  =A15-IF(A8=0,0,A$3*A8/100)
B16  =A16-IF(A9=0,0,A$3*A9/100)

必须在A13和B13中键入公式,然后向下复制。注意B17不需要公式,但B17未被引用,因此如果它具有公式则无关紧要。

复制A13:B17至C13:D17

B13包含已添加到A13以使其成为整数的量。在A14四舍五入之前从A14中减去B13。在列上等等。结果是所有舍入都用在后面的行中。

之前我使用过这种技术,我的客户对结果感到满意。没有使用VBA,你不会比这更好。

答案 1 :(得分:0)

这是一个可以调整最后非零百分比的分配的解决方案。

基于数据布局如下:
A1中的Taget总和 A5:A9中的百分比 百分比范围之后的一个单元格必须为空(A10
A12:A16

中的分摊比例

Aportionment范围的公式(对于单元格A12,然后复制。也可以复制)

=IF(AND(SUM(A6:A$10)=0,A5>0),A$2-SUM(A$11:A11),ROUND(A$2*(A5%),0))

工作原理:

  1. IF(AND(...通过将百分比与当前百分比相加来确定单元格是否为最后一个非零百分比。 Sum范围将一个单元格扩展到百分比范围以外,以使其适用于最后一行。
  2. 如果IF为真,请将计算结果计算为Target - Sum(Rows Above)Sum范围将一个单元格扩展到百分比范围之上,使其适用于第一行。
  3. 如果IF为false,则将分配计算为舍入百分比