SCAN 不只是一个新函数,它代表的是 Excel 计算范式的根本转变。下面把这件事拆透。
一、旧范式的本质:位置思维 + 多米诺骨牌
老方法的核心逻辑是:
B3 = IF(ISNUMBER(A3), B2, A3)
这个公式能成立,依赖三个隐含假设:
假设 含义 脆弱点B2 存在 上一行必须已经有结果 第一行必须手动打底B2 是"上一行" 相对引用绑定物理位置 插入/删除行会断链填充柄拖到位 公式必须覆盖到每一行 不知道数据多少行,只能预拖几千行
这就是位置思维:信息靠"隔壁格子"传递,像多米诺骨牌,每一块推倒下一块。
问题在于:
· 公式链一旦中间断掉,后面全错。· 数据行数变化,必须重新拖。· 空行残留 0 或 #N/A,还要套 IFERROR。· 逻辑藏在"引用关系"里,而不是藏在"规则"里。
二、SCAN 的本质:状态思维 + 累积器
=SCAN(A2, A2:A10, LAMBDA(x, y, IF(ISNUMBER(y), x, y)))
这里发生了三件事:
-
-
x 不是单元格,是一个抽象状态
老方法里 B2 是"上一行的结果"。SCAN 里 x 是"当前所处的科目"。
· x 没有物理地址。· x 不依赖行号。· x 只在你定义的规则里被更新。
位置消失了,状态留下了。
-
-
规则由 LAMBDA 声明,而不是由引用关系暗示
LAMBDA(x, y, IF(ISNUMBER(y), x, y))
读作:
遇到数字,状态不变;遇到文本,状态切换为当前值。
这是声明式逻辑,不是"B3 看 B2"这种空间布局。
-
-
输出形状由数组决定,不由填充柄决定
A2:A10 有 9 行,SCAN 就吐 9 行。数据加到 A20,改成 A2:A20,结果自动 19 行。不需要预拖,不需要猜行数,不需要清空残留。
三、为什么这是"几十年使用习惯"的改变
改变一:从"单元格海洋"到"数组整体"
旧心智模型 新心智模型A1、B2、C3 是独立格子 一整列是一个数组公式在格子间跳转 公式对整组数据计算想的是"这一格等于哪一格" 想的是"这组数据经过什么规则变成另一组"
这不仅是 SCAN。FILTER、SORT、UNIQUE、XLOOKUP、SEQUENCE、MAP、REDUCE、BYROW、BYCOL、GROUPBY……一整套动态数组函数都在做同一件事:
一个公式,吐出一片结果。
改变二:从"被动填充"到"主动溢出"
老时代做模板:
· 先写 5000 行公式备用。· 文件又大又卡。· 空行出 0 或错误值。· 还要 IFERROR 包一层。
动态数组时代:
· 写一个公式。· 数据多少行,结果溢出多少行。· 数据删了,溢出范围自动收缩。· 数据加了,自动扩展。
模板从"预铺铁轨"变成"水到渠成"。
改变三:LAMBDA 让 Excel 第一次拥有"编程能力"
这是最深远的一步。
SCAN、REDUCE、MAP、BYROW、BYCOL 的第三个参数都是 LAMBDA。LAMBDA 的本质是:
把"遇到什么情况怎么处理"写成自定义规则,像写代码一样。
这意味着 Excel 不再只是"会算数的表格",而是:
· 可以定义自己的分组逻辑。· 可以定义自己的累积规则。· 可以定义自己的清洗流程。· 可以把过去要写 VBA 或 Power Query 的事,用一个公式表达。
Excel 从"表格软件"变成了"轻量级数据处理语言"。
四、一张表看清两个时代的区别
维度 旧时代(位置思维) 新时代(状态思维)信息载体 相邻单元格 累积器 x逻辑藏在哪里 引用关系里 LAMBDA 规则里行数变化 手动重拖 自动溢出插入/删除行 公式链断裂 不受影响空行处理 残留 0 / 错误值 自动对齐数组形状公式数量 每行一个 整列一个心智模型 多米诺骨牌 状态机扩展能力 只能组合内置函数 可自定义逻辑
五、用一句话总结
老 Excel 教你怎么"摆格子",SCAN 教你怎么"描述过程"。
· 老方法:B3 看 B2,B4 看 B3,靠物理位置传递信息。· SCAN:维护一个抽象状态,遇到金额不变,遇到科目切换,输出由数组形状自动决定。
这不是"多了一个函数",而是:
Excel 从"单元格计算器"进化成了"数组处理器 + 轻量级编程环境"。
SCAN 之所以重要,是因为它把"状态"这个概念第一次原生地带进了 Excel 公式层。过去你要么用辅助列,要么用 VBA 变量,要么用 Power Query 的累积列。现在,一个公式,一个 LAMBDA,就能表达完整的"扫描—判断—更新—输出"过程。
这就是它改变几十年使用习惯的根本原因。

