乐于分享
好东西不私藏

累计公式总写乱?试试Excel里的SCAN函数

累计公式总写乱?试试Excel里的SCAN函数

在Excel的数据处理工作中,你是否遇到过这样的困惑:明明已经完成了数据汇总,却总感觉少了什么——少了一张能清晰展示变化轨迹的“时间轴”。当领导问起“这一年里,我们的账户余额是如何一步步走到年末的”这样的问题时,你只能靠手工回忆或翻阅账本来回答。

问题的根源在于,我们习惯性地追求最终结果,却忽略了过程本身的价值。今天要介绍的这个函数组合,正是来解决这个问题的。

一、为什么不仅要最终值

来看一个典型的财务场景。假设某公司年初账户余额为10万元,在接下来的一年中,每月都有收入和支出。如果只记录年末的期末余额,我们得到的是一个孤零零的数字——比如12月31日的账户余额是若干万元。但这个数字无法回答以下问题:

  • • 哪个月收入最高?哪个月支出最大?
  • • 账户余额在年中是否出现过下滑?
  • • 全年中有几个月是亏损的(支出大于收入)?
  • • 什么时候账户余额首次突破某个阈值?

这些问题的答案,都藏在过程数据里。传统Excel中,如果我们想获取累计过程,需要逐行编写公式,或者借助辅助列来完成。这不仅增加了工作量,更关键的是——当数据源发生变化时,这些手工编写的公式很容易出现引用错误。

SCAN函数的诞生,正是为了优雅地解决这个问题。它能够一次性返回整个累计过程,而不需要我们手动编写每一个中间步骤的公式。

二、SCAN返回中间结果的逻辑

理解SCAN的关键,在于弄清楚它的三个参数各自扮演什么角色。以账户余额计算为例:

=SCAN(期初余额, 收入和支出区域, LAMBDA累计变量, 当前收入, 当前支出, 累计变量+收入-支出))

第一个参数B2是初始值,即计算的起点——期初余额10万元。第二个参数C2:D2是要遍历的数据,这里是收入和支出两列数据。第三个参数LAMBDA则定义了每一步的计算规则。

LAMBDA表达式中的第一个参数acc是累计变量,它会在每一次迭代中被更新。第一次迭代时,acc等于初始值10万;第二次迭代时,acc等于第一次的计算结果;依此类推。第二个和第三个参数收入和支出则代表当前行的收入和支出数据。

整个LAMBDA的返回值acc+收入-支出会成为下一轮迭代的累计变量初始值。

为了更直观地理解这个过程,我们来看一个简化的计算示例。假设有4个月的数据:

月份
期初余额
收入
支出
1月
100000
50000
30000
2月
—
60000
45000
3月
—
45000
50000
4月
—
70000
35000

使用SCAN函数计算:

=SCAN(B2,C2:D5,LAMBDA(acc,收入,支出,acc+收入-支出))

这个公式的执行过程如下:

  • • 第1次迭代:acc = 100000,收入 = 50000,支出 = 30000,结果 = 100000 + 50000 - 30000 = 120000
  • • 第2次迭代:acc = 120000,收入 = 60000,支出 = 45000,结果 = 120000 + 60000 - 45000 = 135000
  • • 第3次迭代:acc = 135000,收入 = 45000,支出 = 50000,结果 = 135000 + 45000 - 50000 = 130000
  • • 第4次迭代:acc = 130000,收入 = 70000,支出 = 35000,结果 = 130000 + 70000 - 35000 = 165000

最终,SCAN会返回一个数组{120000, 135000, 130000, 165000},完整记录了每一轮的累计结果。

三、累计余额案例

现在,我们将这个逻辑应用到真实业务数据中。根据题目提供的12个月数据,完整的余额累计公式应该这样写:

=SCAN(B2,C2:D13,LAMBDA(acc,收入,支出,acc+收入-支出))

这个公式会返回一个包含12个元素的数组,分别对应1月至12月的期末余额。计算结果如下:

月份
期初余额
收入
支出
累计余额
1月
100000
50000
30000
120000
2月
—
60000
45000
135000
3月
—
45000
50000
130000
4月
—
70000
35000
165000
5月
—
55000
40000
180000
6月
—
48000
52000
176000
7月
—
62000
38000
200000
8月
—
58000
45000
213000
9月
—
65000
42000
236000
10月
—
52000
48000
240000
11月
—
70000
35000
275000
12月
—
60000
40000
295000

通过这个公式,我们不仅得到了年末的期末余额29.5万元,更重要的是获得了全年12个月的余额变化轨迹。从这张表可以看到:余额在6月和10月出现了两次下滑,但在7月之后持续增长,全年整体呈上升趋势。

如果只想看某一年的最终累计结果,SCAN同样能完成任务——只需取返回数组的最后一个值即可:

=INDEX(SCAN(B2,C2:D13,LAMBDA(acc,收入,支出,acc+收入-支出)),12)

但这样做就失去了使用SCAN的意义。既然选择了一个能返回完整过程的函数,就应该充分利用它的全部价值。

四、连续统计案例

SCAN的强大之处不仅在于累计计算,更在于它能与IF函数配合,实现有条件的连续统计。

假设我们需要统计:全年中有多少个月实现了“收入大于支出”的正向增长?具体来说,要从1月开始数起,当收入≤支出时计数重置为0,重新开始统计。

这个问题需要分两步处理:首先判断当前月是否“达标”(收入>支出),然后决定是否继续累计计数。

公式如下:

=SCAN(0,C2:C13,LAMBDA(acc,收入,IF(收入>D2,acc+1,0)))

在这个公式中,初始值设为0,累计变量acc表示当前连续达标的月数。当月收入大于支出时,返回acc+1;否则返回0,表示连续记录中断。

将这个公式应用到真实数据中:

月份
收入
支出
连续达标月数
1月
50000
30000
1
2月
60000
45000
2
3月
45000
50000
0
4月
70000
35000
1
5月
55000
40000
2
6月
48000
52000
0
7月
62000
38000
1
8月
58000
45000
2
9月
65000
42000
3
10月
52000
48000
0
11月
70000
35000
1
12月
60000
40000
2

从表中可以看出:3月和6月、10月出现了收入≤支出的情况,连续计数在这几个月被重置。最长的连续达标周期出现在7月至9月,长达3个月。

如果需要找出全年最长的连续达标周期,可以用MAX函数包裹SCAN:

=MAX(SCAN(0,C2:C13,LAMBDA(acc,收入,IF(收入>D2,acc+1,0))))

结果是3个月。

这个技巧在业务分析中非常实用:可以统计员工连续签单的月数、设备连续运行的天数、库存连续充足的周数等等。

五、与REDUCE的对比

提到SCAN,就不得不提另一个常被同时介绍的函数——REDUCE。这两个函数师出同门,都属于“折叠”类函数家族,但它们的返回值有本质区别。

REDUCE只返回最终结果,而SCAN返回所有中间步骤的结果。

以同样的账户余额数据为例:

=REDUCE(B2,C2:D13,LAMBDA(acc,收入,支出,acc+收入-支出))

这个公式只返回一个值:295000,即年末的最终余额。

而同样的逻辑,用SCAN:

=SCAN(B2,C2:D13,LAMBDA(acc,收入,支出,acc+收入-支出))

返回的是包含12个元素的数组:{120000, 135000, 130000, 165000, 180000, 176000, 200000, 213000, 236000, 240000, 275000, 295000}。

选择使用哪一个,取决于你的实际需求:

  • • 如果你只关心最终累计结果,用REDUCE,效率更高
  • • 如果你需要分析累计过程的变化趋势,用SCAN,信息更完整
  • • 如果你既要最终结果又要中间过程,用SCAN,然后通过INDEX取最后值

在实际工作中,大部分累计类场景都建议优先考虑SCAN,因为你永远不知道什么时候会被问到“过程是怎样的”。

六、实战应用场景

理解了SCAN的核心原理和基本用法之后,我们来看看它在不同业务场景中的具体应用。

场景一:现金流管理

对于企业财务而言,现金流是命脉。SCAN可以帮助财务人员实时追踪账户余额的变化趋势,及时发现异常波动。比如,当累计余额突然下降超过一定幅度时,可以设置预警机制。

场景二:库存余额推演

仓库管理员经常需要知道:按照当前的出库速度,库存还能支撑多少天?用SCAN配合当前库存和每日消耗量,可以推演出库存的逐日变化曲线。当某一天库存降至安全线以下时,就能提前采取补货措施。

场景三:销售目标追踪

销售团队通常有月度、季度、年度目标。SCAN可以追踪每个销售周期结束时距离目标的差距,帮助管理者及时调整策略。如果当前季度结束时累计销售额还未达标,下个季度就需要加大力度。

场景四:累计成本计算

在项目预算管理中,经常需要按阶段统计累计支出。SCAN可以一次性生成各阶段的累计成本表,帮助项目经理判断预算消耗是否在可控范围内。结合IF函数,还可以实时显示“预算正常”或“预算超支”的状态指示。

场景五:绩效连续达标分析

HR部门可以用SCAN分析员工或团队的绩效达标情况。比如,统计客服人员连续多少天满意度达到90%以上,或者销售团队连续几个季度完成了业绩目标。这些数据对于年终评优和人才盘点都有重要参考价值。


总结一下:SCAN函数是Excel动态数组家族中处理累计过程的利器。它能够一次性返回所有中间步骤的结果,比传统的逐行公式更加简洁、高效、可靠。与IF函数配合使用时,SCAN还能实现复杂的条件累计统计,满足各种业务分析需求。

掌握了SCAN,你就拥有了从“只知道结果”到“掌控整个过程”的能力升级。

📚 配套学习资料免费领评论回复:SCAN点击公众号菜单「函数教程」,获取完整示例文件。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料