跳转至

SCAN 函数

函数概述

SCAN 是 Excel 动态数组函数之一,用来对一组数据做“逐步累积计算”,并把每一步的中间结果全部返回为数组。 你可以把它理解为:从左到右(或从上到下)“边走边算”,每走一步就输出一次当前累计值。

典型用途包括:累计和、累计乘积、余额滚动、逐步拼接文本、逐日累计达成、运行中的最大/最小值等。


基础语法

=SCAN([initial_value], array, lambda(accumulator, value))
  • SCAN 会对 array 中的每个元素依次执行 lambda,并输出每一步的累计结果数组。
  • REDUCE 的区别:REDUCE 只返回最终累计值;SCAN 返回所有步骤结果

参数说明

参数 是否必填 含义 说明
initial_value 初始累计值 省略时,Excel 会以 array 的第一个元素作为起点(实际行为会影响结果结构与计算起点,建议需要“从 0/空/指定值开始”时显式填写)
array 需要遍历的数组/区域 可以是行/列区域,也可以是动态数组表达式
lambda(accumulator, value) 逐步计算规则 accumulator 表示上一步累计结果,value 表示当前元素

lambda 必须是 LAMBDA(累计值, 当前值, 计算表达式) 这种结构。


基础用法示范

示例1:累计求和

数据:A2:A7 为每日新增

日期 新增
1/1 5
1/2 3
1/3 6
1/4 2
1/5 4
1/6 1

公式:

=SCAN(0, A2:A7, LAMBDA(acc, v, acc+v))

结果含义:返回每一天的累计总数(5、8、14、16、20、21)。


示例2:账户余额滚动

数据:A2:A7 为每日收支(正为收入,负为支出),期初余额在 E2

  • E2(期初余额):1000
  • A2:A7:-50, 200, -120, -80, 60, -30

公式:

=SCAN(E2, A2:A7, LAMBDA(balance, change, balance+change))

结果含义:输出每天的期末余额数组(950、1150、1030、950、1010、980)。


示例3:逐步拼接文本

数据:A2:A6 为词组:Excel函数

公式:

=SCAN("", A2:A6, LAMBDA(acc, v, IF(acc="", v, acc&" "&v)))

结果含义:逐步输出: 我 我 爱 我 爱 学 我 爱 学 Excel 我 爱 学 Excel 函数


示例4:运行中的最大值

数据:A2:A8 为销量:12, 9, 15, 11, 18, 16, 10

公式:

=SCAN(-1E99, A2:A8, LAMBDA(acc, v, MAX(acc, v)))

结果含义:输出每一步截至当前的最高销量:12、12、15、15、18、18、18。


示例5:带条件的累计

场景:只累计“部门=销售”的业绩

  • A2:A8:部门
  • B2:B8:业绩

公式:

=SCAN(0, B2:B8, LAMBDA(acc, v, acc + IF(INDEX(A2:A8, ROW(v)-ROW(B2)+1)="销售", v, 0)))

这类“跨列条件扫描”更常见的写法是先用 FILTER 得到要累计的数组,再 SCAN,会更清爽。

更推荐的写法(先筛选再累计):

=LET(x, FILTER(B2:B8, A2:A8="销售"),
     SCAN(0, x, LAMBDA(acc, v, acc+v)))

总结

  • SCAN 的核心价值是:把逐步累积过程完整输出,非常适合做运行总计、滚动余额、递进文本、动态指标等。
  • 使用时抓住三点:

    1. 是否需要明确起点:需要就写 initial_value
    2. array 决定遍历顺序(行/列)
    3. LAMBDA(acc, v, …) 决定每一步怎么“更新累计值”
  • 当你只关心最终结果时,用 REDUCE;当你需要每一步过程结果时,用 SCAN