在Excel的数据处理工作中,你是否遇到过这样的困惑:明明已经完成了数据汇总,却总感觉少了什么——少了一张能清晰展示变化轨迹的“时间轴”。当领导问起“这一年里,我们的账户余额是如何一步步走到年末的”这样的问题时,你只能靠手工回忆或翻阅账本来回答。
问题的根源在于,我们习惯性地追求最终结果,却忽略了过程本身的价值。今天要介绍的这个函数组合,正是来解决这个问题的。
一、为什么不仅要最终值
来看一个典型的财务场景。假设某公司年初账户余额为10万元,在接下来的一年中,每月都有收入和支出。如果只记录年末的期末余额,我们得到的是一个孤零零的数字——比如12月31日的账户余额是若干万元。但这个数字无法回答以下问题:
• 哪个月收入最高?哪个月支出最大? • 账户余额在年中是否出现过下滑? • 全年中有几个月是亏损的(支出大于收入)? • 什么时候账户余额首次突破某个阈值?
这些问题的答案,都藏在过程数据里。传统Excel中,如果我们想获取累计过程,需要逐行编写公式,或者借助辅助列来完成。这不仅增加了工作量,更关键的是——当数据源发生变化时,这些手工编写的公式很容易出现引用错误。
SCAN函数的诞生,正是为了优雅地解决这个问题。它能够一次性返回整个累计过程,而不需要我们手动编写每一个中间步骤的公式。
二、SCAN返回中间结果的逻辑
理解SCAN的关键,在于弄清楚它的三个参数各自扮演什么角色。以账户余额计算为例:
=SCAN(期初余额, 收入和支出区域, LAMBDA累计变量, 当前收入, 当前支出, 累计变量+收入-支出))
第一个参数B2是初始值,即计算的起点——期初余额10万元。第二个参数C2:D2是要遍历的数据,这里是收入和支出两列数据。第三个参数LAMBDA则定义了每一步的计算规则。
LAMBDA表达式中的第一个参数acc是累计变量,它会在每一次迭代中被更新。第一次迭代时,acc等于初始值10万;第二次迭代时,acc等于第一次的计算结果;依此类推。第二个和第三个参数收入和支出则代表当前行的收入和支出数据。
整个LAMBDA的返回值acc+收入-支出会成为下一轮迭代的累计变量初始值。
为了更直观地理解这个过程,我们来看一个简化的计算示例。假设有4个月的数据:
使用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月的期末余额。计算结果如下:
通过这个公式,我们不仅得到了年末的期末余额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,表示连续记录中断。
将这个公式应用到真实数据中:
从表中可以看出: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点击公众号菜单「函数教程」,获取完整示例文件。
夜雨聆风