大数跨境

是否所有数组输出都适用scan组合lambda

是否所有数组输出都适用scan组合lambda 浅谈出口账务和excel函数
2026-10-06
3
不是。SCAN 不是万能数组输出工具,它只适用于一类特定模式:对单个数组逐元素扫描,维护一个累积状态,输出与输入同形状的数组。超出这个边界,要么不适用,要么写起来非常别扭,应该换其他函数。

下面把边界讲清楚。

---

一、SCAN 的本质约束

```excel
=SCAN(初始值, 数组, LAMBDA(累积器x, 当前值y, 新x))
```

它有三个硬约束:

约束 说明
只接受一个数组 不能像 MAP 那样同时遍历多个数组
输出形状 = 输入形状 输入 9 行,输出就 9 行;输入 2 列,输出就 2 列
累积器通常是标量 如果 x 变成数组,输出会出现嵌套数组,Excel 动态数组不支持,容易 #CALC!

所以 SCAN 的定位是:

同形状状态扫描器
输入一片格子,输出同样一片格子,每个格子是“扫描到此处时的状态”。

---

二、SCAN + LAMBDA 适用的场景

这些场景用 SCAN 很自然:

场景 示例
空单元格填充上方最近文本 =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)))
状态切换 科目填充、分组编号、连续区间标记
逐行同形状转换 每行加上累计值,但输出行数不变

共同点:输入几个元素,输出几个元素;每个输出依赖前面的状态;形状不变。

---

三、SCAN + LAMBDA 不适用的场景

1. 需要改变形状:筛选、去重、排序、分组

这些输出长度和输入不一样,SCAN 做不到。

需求 正确函数
筛选 FILTER
去重 UNIQUE
排序 SORT / SORTBY
取前 N 行 TAKE / DROP
分组汇总 GROUPBY / PIVOTBY
合并多个数组 VSTACK / HSTACK

例子:从 A2:A10 中筛选大于 100 的金额。

```excel
=FILTER(A2:A10, A2:A10>100)
```

用 SCAN 硬写会非常别扭,而且输出形状对不上。

---

2. 需要聚合为单值:求和、计数、最大最小

SCAN 输出一片,REDUCE 输出一个。

需求 正确函数
累计求和但只留最终值 REDUCE
条件求和 SUMIFS
计数 COUNTIFS
查找最后一个 LOOKUP / XLOOKUP

例子:求 A2:A10 总和。

```excel
=REDUCE(0, A2:A10, LAMBDA(x,y,x+y))
```

或直接 =SUM(A2:A10)。

SCAN 会输出 9 个累计值,不是你要的单个结果。

---

3. 需要同时遍历多个数组

SCAN 只吃一个数组。要同时处理两个数组,用 MAP。

例子:A 列数量,B 列单价,求每行金额。

```excel
=MAP(A2:A10, B2:B10, LAMBDA(q,p,q*p))
```

SCAN 做不到同时接收两个数组。

---

4. 需要按行/列独立累积

SCAN 对整个数组按行优先线性扫描,不区分行。
如果你想“每一行内部独立累计”,需要 BYROW 包一层。

例子:二维数组每行独立累计求和。

```excel
=BYROW(A2:C10, LAMBDA(row, SCAN(0, row, LAMBDA(x,y,x+y))))
```

单独用 SCAN 会把整个二维数组当成一条长链,跨行累积,不符合需求。

---

5. 需要构建变长数组输出

比如“把满足条件的值收集成一个新列表”,输出长度不确定。
SCAN 输出形状固定,不适合。要用 REDUCE + VSTACK 或 FILTER。

例子:收集 A 列所有文本科目。

```excel
=FILTER(A2:A10, ISTEXT(A2:A10))
```

用 SCAN 硬写会得到同形状数组,空位置还得处理,很别扭。

---

四、SCAN 与其它 LAMBDA 函数的组合关系

函数 输出形状 典型用途
MAP 与输入同形状 逐元素映射,可多数组
SCAN 与输入同形状 逐元素扫描,维护状态,输出每步状态
REDUCE 单值(或最终数组) 聚合、归约
BYROW 每行一个结果 按行独立计算
BYCOL 每列一个结果 按列独立计算
MAKEARRAY 指定形状 按行列坐标生成数组
LAMBDA 递归 任意 复杂自定义逻辑

所以:

· 同形状状态跟踪 → SCAN
· 同形状逐元素计算 → MAP
· 聚合成一个结果 → REDUCE
· 按行/列独立 → BYROW / BYCOL
· 自定义形状 → MAKEARRAY / REDUCE + VSTACK
· 筛选排序去重 → FILTER / SORT / UNIQUE

---

五、结论

不是所有数组输出都适用 SCAN + LAMBDA。

SCAN 的适用条件是:

1. 只有一个输入数组;
2. 输出与输入同形状;
3. 需要维护一个累积状态;
4. 累积器最好是标量;
5. 按行优先线性扫描符合业务逻辑。

满足这些,SCAN 非常优雅。
不满足,就选别的函数:

· 要变形 → FILTER / SORT / UNIQUE / VSTACK
· 要聚合 → REDUCE / SUMIFS
· 要多数组 → MAP
· 要按行独立 → BYROW
· 要自定义形状 → MAKEARRAY 或 REDUCE + VSTACK

一句话:

SCAN 是“同形状状态扫描器”,不是“万能数组生成器”。
用它之前先问:输入输出形状一样吗?需要累积状态吗?只吃一个数组够吗?
三个都“是”,才轮到 SCAN。

【声明】内容源于网络
0
0
浅谈出口账务和excel函数
1234
内容 1597
粉丝 0
浅谈出口账务和excel函数 1234
总阅读30.4k
粉丝0
内容1.6k