EXCEL高级函数应用-SCAN函数
**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(累计, 当日, 累计+当日) |
是 |
关键提醒:
-
accumulator是 “累积器”,始终存储上一步的计算结果(如第一步累积后,accumulator= 初始值 + 第一个元素;第二步累积时,accumulator= 第一步结果 + 第二个元素); -
array若为二维区域(如 B2:C10),SCAN 会先将其按 “行优先” 转为一维区域(B2,B3…B10,C2,C3…C10),再逐元素遍历。
二、核心前提:理解 SCAN 的迭代累积逻辑
SCAN 函数的核心价值在于 “逐元素迭代累积”,必须先掌握它与 LAMBDA 的配合逻辑,否则容易误解结果含义:
-
第一步:初始化累积器
SCAN 将
initial_value赋值给 LAMBDA 的accumulator(如初始值 = 0,则accumulator初始为 0),作为累积计算的起点。 -
第二步:逐元素遍历与累积
-
遍历
array的第一个元素,将其赋值给 LAMBDA 的value; -
按
calculation逻辑计算(如accumulator+value),得到第一步累积结果; -
将第一步结果重新赋值给
accumulator,作为下一步的计算基础; -
重复上述过程,直到遍历完
array的所有元素。
-
第三步:返回累积结果数组
每一步的累积结果会被依次记录,最终形成与
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):
-
在 C2 输入
=B2,下拉至 C10 计算累计销售额; -
在 D2 输入
=ROUND(C2/SUM($B$2:$B$10), 2),下拉至 D10 计算占比; -
两步操作,公式分散,总销售额区域需手动锁定(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):
-
在 H2 输入
=F2*G2(第一步加权总和),I2 输入=G2(第一步权重总和),J2 输入=ROUND(H2/I2,2)(第一步加权平均); -
在 H3 输入
=H2+F3*G3,I3 输入=I2+G3,J3 输入=ROUND(H3/I3,2); -
下拉至 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 自动