无需脚本实现Excel/Google Sheets有序无重复组合求和可行吗?
没问题!我刚好有两种无脚本方案分别适配Google Sheets和Excel,完美匹配你要的「按起始元素顺序生成组合+排除重复」的需求,具体如下:
Google Sheets 实现方案
假设你的数据集(1、2、3、4)放在A1:A4单元格,直接用下面的数组公式就能生成你要的所有组合和:
=LET( data, A1:A4, n, COUNTA(data), all_masks, SEQUENCE(2^n - 1, 1, 1), first_one_pos, n - FLOOR(LOG(all_masks, 2)), sorted_masks, SORTBY(all_masks, first_one_pos, 1, all_masks, 1), sums, BYROW(sorted_masks, LAMBDA(mask, SUM(IF(BITAND(mask, BITLSHIFT(1, SEQUENCE(n)-1)), data, 0)))), sums )
公式逻辑拆解
- 用
SEQUENCE生成所有非空子集的二进制掩码(比如数字5对应二进制101,代表选取第1和第3个元素) - 通过
LOG和FLOOR计算每个掩码中第一个1的位置,以此确定组合的起始元素(比如掩码5的第一个1在第1位,对应起始元素1) - 用
SORTBY先按起始元素位置排序,再按掩码大小排序,完全贴合你要的顺序:先1开头的所有组合,再2开头,以此类推,每个起始元素下的组合按元素个数从少到多排列 - 最后用
BYROW遍历每个掩码,计算对应元素的和
Excel 实现方案
适用于Excel 365/2021(支持动态数组)
同样把数据集放在A1:A4,输入下面的数组公式(直接回车即可):
=LET( data, A1:A4, n, COUNTA(data), all_masks, SEQUENCE(2^n - 1), first_one_pos, n - FLOOR.MATH(LOG(all_masks, 2)), sorted_masks, SORTBY(all_masks, first_one_pos, 1, all_masks, 1), sums, BYROW(sorted_masks, LAMBDA(mask, SUM(IF(BITAND(mask, BITLSHIFT(1, SEQUENCE(n)-1)), data, 0)))), sums )
逻辑和Google Sheets完全一致,只是把FLOOR换成了Excel兼容的FLOOR.MATH。
适用于旧版Excel(无动态数组支持)
如果你的Excel版本不支持LET和LAMBDA,可以分步操作:
- 在
C1:C15输入=ROW()(生成1到15的掩码,对应15个非空组合) - 在
D1输入=4-FLOOR(LOG(C1,2)),下拉到D15,计算每个掩码的起始元素位置 - 选中
C1:D15,按D列升序→C列升序排序,得到符合顺序的掩码 - 在
E1输入数组公式=SUM(IF(BITAND(C1,BITLSHIFT(1,ROW($A$1:$A$4)-1)),$A$1:$A$4,0)),按Ctrl+Shift+Enter确认,下拉到E15,即可得到所有组合和
效果验证
不管用哪种方案,最终生成的和列表都会严格遵循你要的顺序:1, 3, 4, 5, 6, 7, 10, 2, 5, 6, 9, 3, 7, 4(注:你给出的示例结果里1+3+4的和应该是8,可能是笔误,公式计算的结果是准确的)
内容的提问来源于stack exchange,提问作者William Stewart




