EXCEL高级函数应用-SCAN函数

office

**Excel SCAN 函数:累积计算的 “动态记录仪”,一步搞定连续统计!

在 Excel 数据统计中,我们经常需要 “连续累积计算”—— 比如按日期统计 “累计销售额”、按订单顺序计算 “累计利润占比”、按员工序号统计 “累计考勤天数”。过去要么逐行输入 “前一行结果 + 当前值” 的公式下拉(如=D2+D3),要么用复杂的 SUMIF 嵌套公式(如=SUM($B$2:B2)),不仅效率低,还容易因删除行导致公式断裂。而 Excel 365 推出的SCAN 函数,能像 “动态记录仪” 一样,从初始值开始,逐元素执行累积计算,一行公式就能返回所有位置的累积结果,堪称 “连续统计的效率王者”。今天就带大家从基础到进阶,全面掌握这个提升累积计算效率的核心函数!

一、吃透基础:SCAN 函数的语法与核心逻辑

SCAN 函数的本质是 “从初始值开始,遍历数据区域的每个元素,逐次执行累积计算并返回每一步结果”,核心是 “初始值 + 逐元素迭代”。理解 “迭代计算逻辑”,是掌握该函数的关键。

1. 基本语法

SCAN(initial\_value, array, lambda(accumulator, value, calculation))

  • 函数 3 个参数均为必选项,缺一不可,且第三个参数必须是 LAMBDA 函数(定义累积计算规则);

  • 最终返回结果为 “一维数组”:长度 = 数据区域的元素个数,每个元素对应 “初始值经过当前元素累积后的结果”(初始值不包含在结果中,仅作为计算起点)。

2. 参数详细说明

结合 “累计销售额统计” 场景,参数含义拆解如下,重点标注 “参数作用” 和 “累积逻辑关联”,避免理解偏差:

参数名称 作用解释 通俗举例(累计销售额场景) 是否必选
initial_value 累积计算的 “初始值”(可以是固定数值、单元格引用,决定累积计算的起点) 初始销售额为 0(从 0 开始累积),或引用 A2 单元格的初始库存 是
array 要遍历的 “数据区域”(可以是单行、单列的一维区域,二维区域会自动转为一维) 每日销售额列(B2:B10,1 列 9 行:1000, 1500, 800…) 是
lambda(accumulator, value, calculation) 累积计算规则:accumulator代表 “上一步累积结果”,value代表 “当前遍历的元素”,calculation是当前步的计算逻辑 定义规则:累计销售额 = 上一步累计结果 + 当前销售额,即lambda(累计, 当日, 累计+当日) 是

关键提醒:

  1. accumulator是 “累积器”,始终存储上一步的计算结果(如第一步累积后,accumulator= 初始值 + 第一个元素;第二步累积时,accumulator= 第一步结果 + 第二个元素);

  2. array若为二维区域(如 B2:C10),SCAN 会先将其按 “行优先” 转为一维区域(B2,B3…B10,C2,C3…C10),再逐元素遍历。

二、核心前提:理解 SCAN 的迭代累积逻辑

SCAN 函数的核心价值在于 “逐元素迭代累积”,必须先掌握它与 LAMBDA 的配合逻辑,否则容易误解结果含义:

  1. 第一步:初始化累积器

    SCAN 将initial_value赋值给 LAMBDA 的accumulator(如初始值 = 0,则accumulator初始为 0),作为累积计算的起点。

  2. 第二步:逐元素遍历与累积

  • 遍历array的第一个元素,将其赋值给 LAMBDA 的value;

  • 按calculation逻辑计算(如accumulator+value),得到第一步累积结果;

  • 将第一步结果重新赋值给accumulator,作为下一步的计算基础;

  • 重复上述过程,直到遍历完array的所有元素。

  1. 第三步:返回累积结果数组

    每一步的累积结果会被依次记录,最终形成与array长度相同的一维数组,按遍历顺序返回。

示例逻辑演示(累计销售额,初始值 = 0,array={1000,1500,800}):

  • 第一步:accumulator=0,value=1000→计算 0+1000=1000→结果 1=1000→accumulator更新为 1000;

  • 第二步:accumulator=1000,value=1500→计算 1000+1500=2500→结果 2=2500→accumulator更新为 2500;

  • 第三步:accumulator=2500,value=800→计算 2500+800=3300→结果 3=3300;

  • 最终返回{1000,2500,3300}(与array长度一致)。

三、实战场景:SCAN 函数的 6 大核心应用

SCAN 的价值体现在 “高效处理连续累积逻辑”,下面用 6 个高频场景示例,覆盖 “累积求和、累计比例、动态计数、财务分析” 等需求,每个示例均包含 “公式 + 逻辑解析 + 对比传统操作”,凸显效率优势。

示例 1:基础应用 —— 按顺序累计求和(每日销售额→累计销售额)

需求:在 “销售表” 中,根据 B2:B10(每日销售额,1 列 9 行:1000,1500,800…),从 0 开始累计计算 “每日累计销售额”,无需逐行下拉公式。

传统操作(无 SCAN):

在 C2 单元格输入=B2(第一天累计 = 当日销售额),C3 输入=C2+B3,C4 输入=C3+B4,下拉填充至 C10,需手动输入 9 次公式,删除行后公式会断裂(如删除 C2,C3 公式变为=#REF!+B3)。

SCAN 公式(一键累计求和):

\=SCAN(0, B2:B10, LAMBDA(累计, 当日, 累计+当日))

解析:

  • initial_value=0:从 0 开始累积;

  • array=B2:B10:遍历每日销售额;

  • LAMBDA(累计, 当日, 累计+当日):累积规则 = 上一步累计结果 + 当前日销售额;

  • 结果:公式输入在 C2 单元格后,自动溢出返回 C2:C10 的累计销售额,删除行后结果自动重新计算,无断裂风险。

示例 2:进阶应用 —— 累计计算占比(累计销售额→累计占比)

需求:在 “销售表” 中,先计算 B2:B10 的累计销售额,再计算 “每日累计销售额占总销售额的比例”,保留 2 位小数(总销售额 = B2:B10 的总和)。

传统操作(无 SCAN):

  1. 在 C2 输入=B2,下拉至 C10 计算累计销售额;

  2. 在 D2 输入=ROUND(C2/SUM($B$2:$B$10), 2),下拉至 D10 计算占比;

  3. 两步操作,公式分散,总销售额区域需手动锁定(B2:B10)。

SCAN 公式(一步累计占比):

\=LET(     总销售额, SUM(B2:B10),  // 先计算总销售额,避免重复计算     累计销售额, SCAN(0, B2:B10, LAMBDA(累计, 当日, 累计+当日)),  // 计算累计销售额     SCAN(0, 累计销售额, LAMBDA( \_, 累计值, ROUND(累计值/总销售额, 2)))  // 计算累计占比 )

解析:

  • 用 LET 函数封装总销售额和累计销售额,避免重复计算;

  • 第二次 SCAN 的initial_value=0仅为占位,_代表不使用上一步累积结果,直接用当前累计值计算占比;

  • 优势:总销售额无需手动锁定,修改 B 列数据时,占比自动同步更新。

示例 3:条件累计应用 —— 仅累计符合条件的数值(仅累计正数利润)

需求:在 “利润表” 中,根据 C2:C10(每日利润,含负数:500,-200,800,-100…),从 0 开始累计 “正数利润总和”(负数利润不参与累计,保持上一步累计结果)。

传统操作(无 SCAN):

在 D2 输入=MAX(0,C2),D3 输入=D2+MAX(0,C3),D4 输入=D3+MAX(0,C4),下拉至 D10,需手动嵌套 MAX 函数,易遗漏。

SCAN 公式(条件累计):

\=SCAN(0, C2:C10, LAMBDA(累计, 当日利润, 累计+MAX(0, 当日利润)))

解析:

  • 累积规则中用MAX(0, 当日利润)筛选正数利润(负数利润转为 0,不影响累计);

  • 结果:当日利润为 500 时,累计 = 0+500=500;当日利润为 - 200 时,累计 = 500+0=500;当日利润为 800 时,累计 = 500+800=1300,符合条件累计需求。

示例 4:动态计数应用 —— 累计统计达标次数(业绩≥80 分的累计次数)

需求:在 “业绩表” 中,根据 D2:D10(员工业绩得分:75,85,90,78,82…),从 0 开始累计 “业绩≥80 分的员工次数”,用于统计达标人数进度。

传统操作(无 SCAN):

在 E2 输入=IF(D2>=80,1,0),E3 输入=E2+IF(D3>=80,1,0),下拉至 E10,需重复嵌套 IF 函数,公式冗长。

SCAN 公式(动态累计计数):

\=SCAN(0, D2:D10, LAMBDA(累计次数, 得分, 累计次数+IF(得分>=80, 1, 0)))

解析:

  • 累积规则中用IF(得分>=80,1,0)将达标得分转为 1,不达标转为 0;

  • 结果:第 1 个员工 75 分→累计 0+0=0;第 2 个员工 85 分→累计 0+1=1;第 3 个员工 90 分→累计 1+1=2,动态反映达标进度。

示例 5:财务分析应用 —— 累计计算资金余额(每日收支→资金余额)

需求:在 “资金流水表” 中,初始资金为 10000 元,根据 E2:E10(每日收支:+3000,-1500,+2000,-500…),计算 “每日资金余额”(余额 = 上一步余额 + 当日收支)。

传统操作(无 SCAN):

在 F2 输入=10000+E2,F3 输入=F2+E3,下拉至 F10,初始资金需手动输入到第一个公式,修改初始资金时需重新下拉。

SCAN 公式(累计资金余额):

\=SCAN(10000, E2:E10, LAMBDA(余额, 当日收支, 余额+当日收支))

解析:

  • initial_value=10000:初始资金作为累积起点;

  • 累积规则 = 上一步资金余额 + 当日收支,直接反映资金变化趋势;

  • 优势:修改初始资金(如改为 15000)时,只需修改initial_value,所有余额结果自动同步,无需重新下拉。

示例 6:复杂累积应用 —— 累计计算加权平均值(按顺序累计加权平均业绩)

需求:在 “绩效表” 中,根据 F2:F10(员工业绩得分)和 G2:G10(权重:0.2,0.3,0.5…),按顺序累计计算 “加权平均业绩”(累计加权平均 =(上一步加权总和 + 当前业绩 × 当前权重)/(上一步权重总和 + 当前权重)),保留 2 位小数。

传统操作(无 SCAN):

  1. 在 H2 输入=F2*G2(第一步加权总和),I2 输入=G2(第一步权重总和),J2 输入=ROUND(H2/I2,2)(第一步加权平均);

  2. 在 H3 输入=H2+F3*G3,I3 输入=I2+G3,J3 输入=ROUND(H3/I3,2);

  3. 下拉至 J10,需 3 列公式配合,操作繁琐。

SCAN 公式(一步累计加权平均):

\=SCAN(     {0,0},  // initial\_value为数组:{上一步加权总和, 上一步权重总和}     HSTACK(F2:F10, G2:G10),  // array为二维区域:{业绩, 权重},HSTACK转为一维遍历     LAMBDA(累积数组, 当前数组,          LET(             上步加权和, INDEX(累积数组,1),             上步权重和, INDEX(累积数组,2),             当前业绩, INDEX(current\_array,1),             当前权重, INDEX(current\_array,2),             新加权和, 上步加权和 + 当前业绩\*当前权重,             新权重和, 上步权重和 + 当前权重,             ROUND(新加权和/新权重和, 2)  // 返回当前步加权平均         )     ) )

解析:

  • initial_value={0,0}:用数组存储两个累积指标(加权总和、权重总和);

  • HSTACK(F2:F10,G2:G10):将业绩和权重合并为二维区域,SCAN 按行优先遍历(先遍历 F2,G2,再 F3,G3…);

  • LAMBDA 中用 INDEX 提取数组元素,计算新加权和与新权重和,最终返回累计加权平均;

  • 优势:一行公式完成 3 列传统操作的功能,逻辑集中,修改权重时无需调整多列公式。

四、总结:SCAN 函数的核心优势与注意事项

1. 核心优势(对比传统累计操作)

对比维度 SCAN 函数 传统逐行下拉公式
效率 一行公式完成所有累计,无需下拉 需逐行输入公式,多列配合时操作繁琐
稳定性 自动重新计算,删除行无断裂风险 删除行后公式易出现 #REF! 错误,需手动修复
灵活性 支持条件累计、多指标累计,逻辑可自定义 条件累计需嵌套多层函数,多指标需多列配合
维护性 累积规则集中定义,修改一步到位 需逐列修改公式,逻辑分散难追溯

2. 必记注意事项

  • 版本要求:仅支持 Excel 365(订阅版),Excel 2021 及以下版本无此函数,会返回 #NAME? 错误;

  • 初始值类型:initial_value的类型需与累积结果类型一致(如累计销售额用数值 0,累计文本用空文本""),否则会返回 #VALUE! 错误;

  • 数组遍历顺序:二维区域会按 “行优先” 转为一维(先遍历第一行所有元素,再遍历第二行),需注意遍历顺序是否符合需求;

  • 结果长度:返回数组的长度与array的元素个数完全一致(二维区域转为一维后的长度),需确保结果区域有足够空白空间,避免 #SPILL! 错误。

SCAN 函数虽然依赖 LAMBDA 函数,但核心逻辑并不复杂 —— 本质是 “让 Excel 自动