excel公式怎么找到和的加数
发布时间:2022-12-04 15:20:49
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),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”,””))
我的脑袋已经不够用了!


猜你喜欢
- 暴风影音5是一款功能十分强大的播放器软件,很多朋友喜欢用它来观看电影、视频等。通常使用暴风影音5观看过的视频都有播放记录,为了不让别人看到自
- WPS2019不连续单元格怎么快速填充相同数据?wps2019表格不连续的单元格想要输入相同的内容,该怎么输入呢?下面我们就来看看详细的教程
- 在WPS演示中并没有给图片设置透明效果的方法,不过可以通过迂回的方法来实现,插入一个形状,然后在形状中填充图片,再对形状设置透明度就可以了。
- excel如何设置单元格内容在指定行区域内容居中大致可以合并居中、跨越合并,以及跨列居中,这些方法到底有什么区别呢,下面小编就为大家详解Ex
- WPS文本怎么设置项目前自动生成编号?我们在文档中编辑了多个项目内容,如果需要给这些项目前加上编号的话,自己手动去添加是非常麻烦的。那么怎么
- 由于不少设备都默认设置了20%的上传速度,文件上传太慢便成了困扰诸多用户的难题。那么,Win10 1909上传速度慢该怎么办呢?有类似困扰的
- 电脑256固态硬盘怎么分区?相信很多人都有这个疑惑。只有一个分区肯定是不行的,所有的东西都放在里面,如果出现问题需要重装系统,如果没有备份,
- Win10系统接网线后显示本地连接未识别网络怎么办?最近有用户询问这个问题,在电脑的使用中,经常需要连接网络,接网线后显示本地连接未识别是怎
- Win8.1提示此应用无法安装程序怎么解决?最近有Win8.1的用户在商店中下载应用的时候却遇到了错误信息:此应用无法安装。请再试一次。错误
- 360浏览器是一款非常不错的电脑浏览器,但是很多小伙伴有遇见过在设置软件极速模式的时候不知道如何操作,需要找到文件夹的位置,其实一般系统默认
- 在excel表格中操作键盘上的箭头,在excel表格中操作键盘上的箭头,Scroll Lock就是滚动锁定的意思, , 图中红色标记1的地方
- 在OS X El Capitan中,目前默认的系统登录界面壁纸是桌面壁纸的“模糊版”,通过自定义可以让系统登录界面的壁纸变得更加清晰。下面就
- excel vba编程在窗体上画一座房子。这篇教程是向大家介绍利用excel vba编程在窗体上画一座房子方法,教程比较基础,制作出来的效果
- 有网友问小编win8.1怎么关闭skydrive?接下来小编就为大家介绍win8.1 skydrive卸载教程,感兴趣的朋友可以看一下小编带
- 加入Windows预览版体验计划可以获得Win11系统的推送,但是有不少朋友却发现没有获得推送通知,导致这种情况的问题有多种原因,下面就让小
- 马桶MT如何关注好友?马桶MT是一款不错的社交软件,在里面我们还可以关注好友,具有要怎么关注呢,下面就给大家分享马桶MT关注好友的方法。添加
- 硕思Logo设计师是一款非常专业的Logo设计软件,拥有海量设计模板、其中包括400多种颜色、40多种字体、2500多种矢量图形等,内容非常
- Word文档的使用对我们工作来讲非常的重要,Word的运用也比较简单,那么接下来让我们来了解一下如何在WPS里插入视频吧。步骤一:找到自己的
- Word如何旋转表格和文字?在我们平常Word文档编辑中,有时候会由于一些特殊情况,需要将文档中的表格及文字旋转一定的方法,那么应该如何操作
- Excel中经常需要建立一些表格进行归类数据,建立表格具体该如何操作呢?下面是由小编分享的excel建立表格的方法,以供大家阅读和学习。ex