问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

excel公式教程找到和的加数

发布网友 发布时间:2024-09-10 07:49

我来回答

1个回答

热心网友 时间:2024-11-03 11:48

如下图2所示,在单元格A1中给出了目标值1054.35,在单元格A2:A11中有10个值,现在我们想知道这些值中哪些值相加等于1054.35,在这些值右侧单元格中使用“X”标记。如果有几种组合加起来都等于1054.35,则将他们都标识出来。

图1

在单元格B2中输入公式,然后向下拖放至单元格B11、向右拖放至K列,得到结果。

在本例中,有3个组合:

1054.35=350.25+246.89+457.21

1054.35=290.27+123.69+198.56+201.35+240.48

1054.35=283.75+290.27+123.69+201.35+155.29

那么,如何编写这个公式呢?

先不看答案,自已动手试一试。

公式

在单元格B2中输入数组公式:

=IF(COLUMNS($A:A)>$L$1,””,IF(INDEX(INDEX(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),SMALL(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=$A$1,Arry2),COLUMNS($A:A)),),ROWS($1:1)),”X”,””))

向下拖拉至单元格B11,向右拖至列K。

公式使用了一个辅助单元格L1,内容为相加等于目标值的组合的个数,其中使用的数组公式为:

=SUM(N(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=A1))

公式解析

公式中的Values、Arry1和Arry2是定义的三个名称。

名称:Values

引用位置:=$A$2:$A$11

名称:Arry1

引用位置:=ROW(INDIRECT(“1:” & ROWS(Values)))

名称:Arry2

引用位置:=ROW(INDIRECT(“1:” & 2^ROWS(Values)))

下面以一个确定为和的加数的单元格中的公式,来看看公式是怎么运转的。在单元格B5中的公式为:

=IF(COLUMNS($A:A)>$L$1,””,IF(INDEX(INDEX(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),SMALL(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=$A$1,Arry2),COLUMNS($A:A)),),ROWS($1:4)),”X”,””))

1. 先看看公式中的这部分:

MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2)

这是本解决方案的关键。上述部分公式将会生成一个1024行10列的大矩阵数组,为了更好地理解其运作原理,我们看一个生成的数组数量较小的版本。

假设数值是4个,而不是示例中的10个,即名称Values定义不是:

=$A2:$A11

而是:

=$A2:$A5

这样,名称Arry1:

=ROW(INDIRECT(“1:”& ROWS(Values)))

转换为:

=ROW(INDIRECT(“1:” & 4))

得到:

{1;2;3;4}

名称Arry2:

=ROW(INDIRECT(“1:”& 2^ROWS(Values)))

转换为:

=ROW(INDIRECT(“1:” & 2^4))

转换为:

=ROW(INDIRECT(“1:” & 16))

得到:

{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16}

这样,部分公式:

MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2)

转换为:

MOD(INT(({1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16}-1)/2^(TRANSPOSE({1;2;3;4})-1)),2)

转换为:

MOD(INT(({1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16}-1)/2^({0,1,2,3})),2)

转换为:

MOD(INT(({1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16}-1)/{1,2,4,8}),2)

转换为:

MOD(INT(({0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15})/{1,2,4,8}),2)

执行数组除法,因为这两个数组正交,即一个16行1列数组除以一个1行4列数组,得到一个16行4列数组:

MOD(INT(

{0,0,0,0;

1,0.5,0.25,0.125;

2,1,0.5,0.25;

3,1.5,0.75,0.375;

4,2,1,0.5;

5,2.5,1.25,0.625;

6,3,1.5,0.75;

7,3.5,1.75,0.875;

8,4,2,1;

9,4.5,2.25,1.125;

10,5,2.5,1.25;

11,5.5,2.75,1.375;

12,6,3,1.5;

13,6.5,3.25,1.625;

14,7,3.5,1.75;

15,7.5,3.75,1.875}

),2)

取整后的结果:

MOD(

{0,0,0,0;

1,0,0,0;

2,1,0,0;

3,1,0,0;

4,2,1,0;

5,2,1,0;

6,3,1,0;

7,3,1,0;

8,4,2,1;

9,4,2,1;

10,5,2,1;

11,5,2,1;

12,6,3,1;

13,6,3,1;

14,7,3,1;

15,7,3,1}

),2)

对2求余后的结果:

{0,0,0,0;

1,0,0,0;

0,1,0,0;

1,1,0,0;

0,0,1,0;

1,0,1,0;

0,1,1,0;

1,1,1,0;

0,0,0,1;

1,0,0,1;

0,1,0,1;

1,1,0,1;

0,0,1,1;

1,0,1,1;

0,1,1,1;

1,1,1,1}

可以看到,我们成功地创建了一个由0和1组成4个元素的所有16种组合。

因此,如果我们使用合适的矩阵乘法,就可以生成名称Values定义的单元格区域中数据求和的所有可能组合。例如,上面数组矩阵的第4行:

{1,1,0,0}

与假设的数据区域:

{283.75;350.25;290.27;246.89}

作为MMULT函数的参数:

=MMULT({1,1,0,0},{283.75;350.25;290.27;246.89})

得到数据区域中第1个值和第2个值之和。

又如,数组矩阵的第15行:

{0,1,1,1}

与假设的数据区域:

{283.75;350.25;290.27;246.89}

作为MMULT函数的参数:

=MMULT({0,1,1,1},{283.75;350.25;290.27;246.89})

得到数据区域中第2个值、第3个值和第4个值之和。

由于我们已经生成了所有0和1的组合,因此可以计算出数据区域内所有可能组合的和。

虽然上面讲述的是数据区域只有4个数值的情况,但它适用于其他大小的数值数量。

2. 有了上述详细讲解,我们再看看公式中的部分:

MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)

将返回名称Values定义的单元格区域中数值所有可能的组合之和,组成一个1024行1列的数组,共1024个元素。下面是该数组的前50个元素:

{0;283.75;350.25;634;290.27;574.02;640.52;924.27;246.89;530.64;597.14;880.89;537.16;820.91;887.41;1171.16;457.21;740.96;807.46;1091.21;747.48;1031.23;1097.73;1381.48;704.1;987.85;1054.35;1338.1;994.37;1278.12;1344.62;1628.37;123.69;407.44;473.94;757.69;413.96;697.71;764.21;1047.96;370.58;654.33;720.83;1004.58;660.85;944.6;1011.1;1294.85;580.9;864.65;…}

上面的数组中包含等于目标值的元素(红色字体标记),还有两个是第485个和第678个元素也等于目标值。

3. 这样,公式中的部分:

MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=$A$1

实际为:

{0;283.75;350.25;634;290.27;574.02;640.52;924.27;246.89;530.64;597.14;880.89;537.16;820.91;887.41;1171.16;457.21;740.96;807.46;1091.21;747.48;1031.23;1097.73;1381.48;704.1;987.85;1054.35;1338.1;994.37;1278.12;1344.62;1628.37;123.69;407.44;473.94;757.69;413.96;697.71;764.21;1047.96;370.58;654.33;720.83;1004.58;660.85;944.6;1011.1;1294.85;580.9;864.65;…}=1054.35

比较后的结果为:

{FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;…}

4. 公式中的部分:

SMALL(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=$A$1,Arry2),COLUMNS($A:A))

返回每个为TRUE的元素在数组中的位置:

SMALL(IF({FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;…},{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;…}),1)

转换为:

SMALL({FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;27;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;…},1)

得到:

27

这告诉我们,1024个和中的第27个与我们的目标值相等。

5. 现在,我们需要返回到1024个组合的矩阵数组(即前面得到的1024行10列的矩阵),以找出这个与目标值相等的求和中涉及到的具体数值,因此,使用INDEX函数提取该矩阵数组中第27行的值:

INDEX(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),SMALL(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=$A$1,Arry2),COLUMNS($A:A)),)

转换为:

INDEX({0,0,0,0,0,0,0,0,0,0;1,0,0,0,0,0,0,0,0,0;0,1,0,0,0,0,0,0,0,0;1,1,0,0,0,0,0,0,0,0;0,0,1,0,0,0,0,0,0,0;1,0,1,0,0,0,0,0,0,0;0,1,1,0,0,0,0,0,0,0;1,1,1,0,0,0,0,0,0,0;0,0,0,1,0,0,0,0,0,0;1,0,0,1,0,0,0,0,0,0;0,1,0,1,0,0,0,0,0,0;1,1,0,1,0,0,0,0,0,0;0,0,1,1,0,0,0,0,0,0;1,0,1,1,0,0,0,0,0,0;0,1,1,1,0,0,0,0,0,0;1,1,1,1,0,0,0,0,0,0;0,0,0,0,1,0,0,0,0,0;1,0,0,0,1,0,0,0,0,0;0,1,0,0,1,0,0,0,0,0;1,1,0,0,1,0,0,0,0,0;0,0,1,0,1,0,0,0,0,0;1,0,1,0,1,0,0,0,0,0;0,1,1,0,1,0,0,0,0,0;1,1,1,0,1,0,0,0,0,0;0,0,0,1,1,0,0,0,0,0;1,0,0,1,1,0,0,0,0,0;0,1,0,1,1,0,0,0,0,0;1,1,0,1,1,0,0,0,0,0;0,0,1,1,1,0,0,0,0,0;1,0,1,1,1,0,0,0,0,0;0,1,1,1,1,0,0,0,0,0;1,1,1,1,1,0,0,0,0,0;0,0,0,0,0,1,0,0,0,0;1,0,0,0,0,1,0,0,0,0;0,1,0,0,0,1,0,0,0,0;1,1,0,0,0,1,0,0,0,0;0,0,1,0,0,1,0,0,0,0;1,0,1,0,0,1,0,0,0,0;0,1,1,0,0,1,0,0,0,0;1,1,1,0,0,1,0,0,0,0;0,0,0,1,0,1,0,0,0,0;1,0,0,1,0,1,0,0,0,0;0,1,0,1,0,1,0,0,0,0;1,1,0,1,0,1,0,0,0,0;0,0,1,1,0,1,0,0,0,0;1,0,1,1,0,1,0,0,0,0;0,1,1,1,0,1,0,0,0,0;1,1,1,1,0,1,0,0,0,0;0,0,0,0,1,1,0,0,0,0;1,0,0,0,1,1,0,0,0,0;…},27,)

结果为:

{0,1,0,1,1,0,0,0,0,0}

与单元格A3、A5和A6相对应。

6. 接下来就很简单了。只需检查所在行是否与该数组中的非零值对应:

IF(INDEX(INDEX(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),SMALL(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Values)=$A$1,Arry2),COLUMNS($A:A)),),ROWS($1:4)),”X”,””)

转换为:

IF(INDEX({0,1,0,1,1,0,0,0,0,0},ROWS($1:4)),”X”,””)

转换为:

IF(INDEX({0,1,0,1,1,0,0,0,0,0},4),”X”,””)

转换为:

IF(1,”X”,””)

得到

X

扩展版

下面是一个修订版,具有以下功能:可以由用户指定加数的数量。如下图2所示。

图2

在图2所示的工作表中,单元格L2中的值表示只希望采用A2:A11中3个值组合之和等于目标值。可以看到,8种组合中,每种确实只有3个值。

在单元格L1中的数组公式为:

=SUM(N(MMULT(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Arry1^0)=L2,MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),0),Values)=A1))

在单元格B2中的数组公式为:

=IF(COLUMNS($A:A)>$L$1,””,IF(INDEX(INDEX(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),SMALL(IF(MMULT(IF(MMULT(MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),Arry1^0)=$L$2,MOD(INT((Arry2-1)/2^(TRANSPOSE(Arry1)-1)),2),0),Values)=$A$1,Arry2),COLUMNS($A:A)),),ROWS($1:1)),”X”,””))

我的脑袋已经不够用了!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
云南经济管理学院正规吗 云南经济管理学院有转公立的可能吗 云南经济管理学院是民办大学还是公办大学 云南经济学院是公办还是民办 如果抚养费纠纷如何处理 婚内出轨协议书怎么写? 婚内出轨协议书(甄选7篇) 朗姆酒提子蛋糕做法大全 酒香提子戚风小诀窍 提子戚风蛋糕做法 如何将Excel表格中两个相同名称的数相加 如何用excel筛选出数据进行求和? 江西婚假多少天2023年新规定江西结婚礼金一般给多少 江西婚假多少天2023年新规定 2023年江西婚假有几天 孙悟空最强铭文碎片是什么(王者荣耀孙悟空的最强铭文) 医疗事故诉讼如何收集证据? 房产交易纠纷房产纠纷无法和解怎么办 房地产开发工程合同纠纷怎么处理 东京奥运会中国第几个出场2021 奥运开幕式中国第几个出场 奥运会开幕式中国队第几个出场 奥运开幕式中国代表团第几个出场的 奥运会中国代表团出场了吗 奥运会中国代表团出场了没 巴黎奥运会开幕式中国出场了吗 巴黎奥运会中国队什么时候出场的 2024巴黎奥运会开幕式中国队第几个出场 双头斗胆灯图片尺寸双头斗胆灯套什么定额 LED斗胆灯产品参数 图解宝宝便便 excel中怎么让两数相加等于指定值? 自己儿子都不顾的男人还爱老婆吗? 生病了看透人心的句子 劝人开心的暖心句子精选21句 拼多多电脑开直通车(拼多多电脑直通车怎么开) 拼多多电脑开直通车(拼多多开直通车大忌) 国际站新手商家必看:阿里卖家 PC 端常见操作指引(三) 夏天身体总是凉的冷痛该吃些什么补呢又怕冷又? 补肾如何补肾 翡翠油青是什么意思? 展示柜后面加宣传灯好吗 电信宽带收费标准是怎样的? 请问滁州电信的手机卡月租最低是多少钱?我用的是移动的卡,但是信号差... 时间继电器有几种类型 ?区别是什么? 两万块钱能买哈雷摩托车吗 嫌疑人涉嫌伪证罪判多久 如何挽回已经分手的男朋友? 家暴法律会怎么判 渣男会和什么样的女人结婚? 渣男会和你说结婚证吗?