是否所有数组输出都适用scan组合lambda
浅谈出口账务和excel函数 不是。SCAN 不是万能数组输出工具,它只适用于一类特定模式:对单个数组逐元素扫描,维护一个累积状态,输出与输入同形状的数组。超出这个边界,要么不适用,要么写起来非常别扭,应该换其他函数。
=SCAN(初始值, 数组, LAMBDA(累积器x, 当前值y, 新x))
只接受一个数组 不能像 MAP 那样同时遍历多个数组
输出形状 = 输入形状 输入 9 行,输出就 9 行;输入 2 列,输出就 2 列
累积器通常是标量 如果 x 变成数组,输出会出现嵌套数组,Excel 动态数组不支持,容易 #CALC!
输入一片格子,输出同样一片格子,每个格子是“扫描到此处时的状态”。
空单元格填充上方最近文本 =SCAN(A2,A2:A10,LAMBDA(x,y,IF(y="",x,y)))
累计求和 =SCAN(0,A2:A10,LAMBDA(x,y,x+y))
条件累计 =SCAN(0,A2:A10,LAMBDA(x,y,IF(y>0,x+y,x)))
共同点:输入几个元素,输出几个元素;每个输出依赖前面的状态;形状不变。
例子:从 A2:A10 中筛选大于 100 的金额。
=FILTER(A2:A10, A2:A10>100)
用 SCAN 硬写会非常别扭,而且输出形状对不上。
=REDUCE(0, A2:A10, LAMBDA(x,y,x+y))
SCAN 会输出 9 个累计值,不是你要的单个结果。
SCAN 只吃一个数组。要同时处理两个数组,用 MAP。
=MAP(A2:A10, B2:B10, LAMBDA(q,p,q*p))
如果你想“每一行内部独立累计”,需要 BYROW 包一层。
=BYROW(A2:C10, LAMBDA(row, SCAN(0, row, LAMBDA(x,y,x+y))))
单独用 SCAN 会把整个二维数组当成一条长链,跨行累积,不符合需求。
比如“把满足条件的值收集成一个新列表”,输出长度不确定。
SCAN 输出形状固定,不适合。要用 REDUCE + VSTACK 或 FILTER。
=FILTER(A2:A10, ISTEXT(A2:A10))
用 SCAN 硬写会得到同形状数组,空位置还得处理,很别扭。
四、SCAN 与其它 LAMBDA 函数的组合关系
SCAN 与输入同形状 逐元素扫描,维护状态,输出每步状态
· 自定义形状 → MAKEARRAY / REDUCE + VSTACK
· 筛选排序去重 → FILTER / SORT / UNIQUE
不是所有数组输出都适用 SCAN + LAMBDA。
· 要变形 → FILTER / SORT / UNIQUE / VSTACK
· 要自定义形状 → MAKEARRAY 或 REDUCE + VSTACK
SCAN 是“同形状状态扫描器”,不是“万能数组生成器”。
用它之前先问:输入输出形状一样吗?需要累积状态吗?只吃一个数组够吗?