You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

无需脚本实现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个元素)
  • 通过LOGFLOOR计算每个掩码中第一个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版本不支持LETLAMBDA,可以分步操作:

  • 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

火山引擎 最新活动