优化Excel公式:减少OFFSET函数重复调用,降低手动输入量
Excel公式优化:简化滑动窗口求和取最大值的写法
需求
改写现有Excel公式,减少手动重复输入,避免多次调用OFFSET函数(每次使用不同列参数),转而支持直接传入列范围作为输入。
原公式
MAX(SUM(OFFSET(C3,0,COLUMNS(C3:C3)-1,1,$A$3)),SUM(OFFSET(C3,0,COLUMNS(C3:D3)-1,1,$A$3)),SUM(OFFSET(C3,0,COLUMNS(C3:E3)-1,1,$A$3)),SUM(OFFSET(C3,0,COLUMNS(C3:F3)-1,1,$A$3)))
失败尝试
曾尝试用SEQUENCE简化,但未得到预期结果:
MAX(SUM(OFFSET(C3,0,SEQUENCE(1,COLUMNS($C$3:$F$3)-1,0,1),1,$A$3)))
示例说明
- 第一行(A1=4):按每4列滑动求和(如B1:E1和为2,C1:F1和为1等),最终返回最大值2
- 第二行(A2=3):按每3列滑动求和,返回对应最大值
示例数据
| A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|
| 4 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
| 3 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 2 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
| 6 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
| 8 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 3 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
| 5 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 9 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 2 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 3 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
| 7 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 6 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
解决方案
方案1:使用MAP+OFFSET(动态数组兼容)
=MAX(MAP(SEQUENCE(1, COLUMNS($B:$J)-$A3+1, 0), LAMBDA(x, SUM(OFFSET($B3, 0, x, 1, $A3)))))
- 逻辑:
SEQUENCE生成所有合法的起始偏移量,MAP遍历每个偏移量,对对应区域求和,最后用MAX取所有求和结果的最大值 - 优势:简洁直观,直接对应需求逻辑
方案2:使用SUMPRODUCT(非易失性,更稳定)
=MAX(SUMPRODUCT(--(COLUMN($B:$J)-COLUMN($B3)>=SEQUENCE(COLUMNS($B:$J)-$A3+1,1,0))*(COLUMN($B:$J)-COLUMN($B3)<SEQUENCE(COLUMNS($B:$J)-$A3+1,1,$A3)), $B3:$J3))
- 逻辑:通过列号判断生成滑动窗口的掩码,用
SUMPRODUCT计算每个窗口的和,最后取最大值 - 优势:避免
OFFSET的易失性(公式会随任意单元格修改而重新计算),运行更稳定
失败原因分析
你之前的SEQUENCE尝试失败,核心原因是:OFFSET接收数组偏移量时会返回多个区域,但SUM函数会直接将所有区域的数值合并后求和,得到一个单一总和,而非对每个区域分别求和。此时MAX只能取这个单一值,无法得到各个滑动窗口的求和最大值。
内容的提问来源于stack exchange,提问作者N. Berenst
相关产品推荐
相关产品推荐

