手机版

如何在excel公式中查找和的加数?

时间:2021-09-13 来源:互联网 编辑:宝哥软件园 浏览:

如何在excel公式中找到和的加数?如下图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)、值)=$A$1,arry2)、列($A:A)))、行($1:1))、“”、“))

向下拖到单元格B11,向右拖到列k。

该公式使用辅助单元格L1,其内容是总和等于目标值的组合数,使用的数组公式为:

=sum(n(mmult(mod(int((arry2-1)/2^(transpose(arry1)-1)),2),values)=a1)

公式分析

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

名称:值

参考位置:=$ 2:澳元$11澳元。

名称:Arry1。

参考位置:=行(间接(“1:”行(值))

名称:Arry2。

参考位置:=行(间接(“1:”2行(值))

让我们取一个单元格中的公式作为sum的加数,看看这个公式是如何工作的。单元格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)、值)=$A$1,arry2)、列($A:A)))、行($1:4))、“”、“))

1.首先看公式的这一部分:

mod(int((arry2-1)/2^(transpose(arry1)-1)),2)

这是这个解决方案的关键。上面的一些公式将生成一个1024行10列的大矩阵数组。为了更好地理解它的工作原理,我们将看一个带有少量生成数组的版本。

假设数字是4,而不是示例中的10,也就是说,名称Values没有定义为:

=$A2:$A11

但是:

=$A2:$A5

这样,名称Arry1:

=行(间接(“1:”行(值))

转换为:

=ROW(间接(" 1:" 4))

获取:

{1;2;3;4}

名称Arry2:

=ROW(间接(" 1:" 2^ROWS(Values)))

转换为:

=ROW(间接(" 1:" 2^4))

转换为:

=ROW(INternet(" 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个组合。

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

{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})

获取数据区中第一个值和第二个值的总和。

另一个例子是数组矩阵的第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})

获取数据区中第二个值、第三个值和第四个值的总和。

因为我们已经生成了0和1的所有组合,所以我们可以计算数据区域中所有可能组合的总和。

尽管上面描述了在数据区中只有4个数值,但是它适用于其他大小的数值。

2.有了上面的详细解释,我们再来看看公式的一些部分:

mmult(mod(int((arry2-1)/2^(transpose(arry1)-1)),2),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假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;真;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;…}

4.公式的一部分:

small(if(mmult(mod(int((arry2-1)/2^(transpose(arry1)-1)),2),values)=$a$1,arry2),columns($a:a)

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

小(如果({假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;真;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;…},{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;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;27;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;假;…},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,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中的三个值组合的总和预计等于目标值。可以看出,这八个组合中的每一个真的只有三个值。

单元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 "、""))

我脑袋不够用!

版权声明:如何在excel公式中查找和的加数?是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。