SCAN与LAMBDA组合公式返回异常结果的原因解析
关于SCAN与LAMBDA组合公式的计算逻辑疑问
数据集(A2:A5)
1 3 6 10
已知测试结果
- 公式
=SCAN(0, A2:A5, LAMBDA(aa, bb, aa+bb))(累积求和)返回:1 4 10 20 - 公式
=SCAN(0, A2:A5, LAMBDA(aa, bb, ROW(bb)-1))(返回当前行索引)返回:1 2 3 4
疑问点
使用公式 =SCAN(0, A2:A5, LAMBDA(aa, bb, (aa+bb)*(ROW(bb)-1))) 时,实际返回:
1 8 42 208
但预期结果是:
1 8 30 80
而用 =ArrayFormula(SCAN(0, A2:A5, LAMBDA(aa, bb, aa+bb))*(ROW(A2:A5)-1)) 能得到预期结果,为什么直接组合的公式不行?
原因拆解
SCAN函数的核心是累积计算,LAMBDA里的aa是上一次计算的结果,不是每次都从初始值0重新开始。我们一步步拆解错误公式的计算过程:
第1行(A2):
- aa=初始值0,bb=1,ROW(bb)-1=1
- 计算:
(0+1)*1 = 1→ 和预期一致
第2行(A3):
- aa=上一步结果1,bb=3,ROW(bb)-1=2
- 计算:
(1+3)*2 = 4*2=8→ 和预期一致
第3行(A4):
- aa=上一步结果8,bb=6,ROW(bb)-1=3
- 计算:
(8+6)*3 =14*3=42→ 这里你错误认为aa是累积求和的10,但实际上aa已经是上一步的计算结果8,所以得到42而非预期的30
第4行(A5):
- aa=上一步结果42,bb=10,ROW(bb)-1=4
- 计算:
(42+10)*4=52*4=208→ 同理,aa是42而非累积求和的20,所以得到208而非80
正确公式的逻辑
=ArrayFormula(SCAN(0, A2:A5, LAMBDA(aa, bb, aa+bb))*(ROW(A2:A5)-1)) 是先完成完整的累积求和得到数组[1,4,10,20],再和行索引数组[1,2,3,4]逐个相乘,这完全符合你的预期逻辑:
1*1=1,4*2=8,10*3=30,20*4=80
简单来说,你混淆了SCAN内部的累积值:直接组合的公式里,每次计算的结果会作为下一次的aa参与运算;而正确公式是先算出所有累积求和值,再统一乘行索引,两次计算完全独立。
内容的提问来源于stack exchange,提问作者ulrichson
相关产品推荐
相关产品推荐

