📌 阶段三 · 函数核心 · 第10讲 SUMIF函数 · 约 50 分钟

建造系统的心脏——库存台账:两列 SUMIF 汇总出入库流水,当前库存和补货状态实时更新

学习目标

  • 掌握 SUMIF 三个参数的含义,会写条件求和公式
  • 分清 SUMIF 与 SUMIFS 的参数顺序差异,会按月多条件求和
  • 用 SUMIF 在库存台账算出每个商品的累计入库与累计出库
  • 搭出「期初 + 入库 - 出库 = 当前库存」的台账核心算法
  • 用数据有效性守住「出库不能超库存」的防线

知识点讲解

SUMIF:带条件求和,进销存的灵魂函数

上一讲 COUNTIF 负责数个数,这一讲 SUMIF 负责加金额、加数量:根据指定条件对区域求和。

语法:=SUMIF(range,criteria,sum_range)。第 1 参数是条件区域(按哪一列找),第 2 参数是条件(找谁),第 3 参数是求和区域(把什么加起来)。

它对进销存的意义怎么强调都不为过:库存台账的「累计入库」「累计出库」两列,本质上就是两条 SUMIF——在入库单里把这个商品的数量全部加起来,在出库单里再来一遍。

=SUMIF(入库单!C:C,A2,入库单!G:G)

在入库单 C 列(商品编号)里找 A2 这个编号(条件),把对应的 G 列(数量)全部加总——结果就是该商品全年的累计入库数量。

💡 提示:

  • 条件区域和求和区域的行必须一一对齐:C 列第 5 行的数量对应 G 列第 5 行
  • 条件引用单元格而不是敲死文字,一个公式下拉 30 行就是 30 个商品的台账

第三参数可以省:条件区域就是求和区域的时候

sum_range 不是必填项。当求和的区域和条件区域是同一列时,第 3 参数可以省略——条件区域就是实际求和区域。

讲义例子:把发生额大于 500 的加总,条件和求和都落在金额列上,写 =SUMIF(E:E,">500") 就够了。

进销存场景:想看看入库单里大单(金额 1000 以上)一共进了多少钱,直接对金额列写条件,一条公式搞定。

=SUMIF(E:E,">500")

条件区域和求和区域都是 E 列本身,第 3 参数省略——把 E 列中大于 500 的数加总。

=SUMIF(入库单!I:I,">1000")

对入库单金额列求大单合计:条件区域就是金额列,省略求和区域。

💡 提示:

  • 省略第 3 参数的前提:判断的列和加总的列是同一列

第三参数的简写:选一个格子也能代表一列

讲义里有个很妙的规则,三条一起记:① 规范写法里 range 与 sum_range 必须一样大;② 但 SUMIF 容错性很好,第 3 参数选小了会自动补齐到和条件区域一样大,所以可以简写;③ 简写时必须保证第 3 参数的第一行与 range 的第一行相对应。

由此还进化出「多列求和」玩法:把整张表选作条件区域,求和区域只选一个金额单元格(对准第一行),条件列和金额列中间隔多少列都无所谓,SUMIF 自动帮你对齐。

=SUMIF($A$2:$I$100,A2,$I$2)

整块表 A2:I100 当条件区域,第 3 参数只给金额列第一个格子 I2 作锚点,SUMIF 自动把求和区域补齐——多列布局也能一式求和。

💡 提示:

  • 简写虽爽,锚点千万不能错:第三参数的第一行必须正对条件区域的第一行,否则加总整体错位

长数字同款坑:&"*" 照样管用

和 COUNTIF 一样,SUMIF 默认也最多只比对数据的前 15 位。给超长银行卡号、条形码按号码求和时,前 15 位相同的两条记录会被混在一起加。

解决办法一字不差:在条件后面连接 &"*",强制按文本比对。

=SUMIF(A:A,A2&"*",B:B)

按长号码求和的标准姿势:A2&"*" 绕开 15 位限制,B 列只加真正匹配的那条。

💡 提示:

  • 15 位以内的编号无需处理;超长编码建议一开始就设成文本格式

辅助列:没有 SUMIFS 年代的多条件求和

想同时满足「某供应商 + 某商品」两个条件,除了下一节的 SUMIFS,还有一招老办法——辅助列:在数据右侧加一列,把两个条件列连接起来做成新关键字,比如 =C2&"-"&MONTH(B2) 把商品编号和月份连成一串;查询时条件也用连接写法对应上,再对这个辅助列做普通 SUMIF。

进销存里「每个商品每个月进了多少货」这种需求,辅助列能把二维问题拍平成一维。

=C2&"-"&MONTH(B2)

辅助列公式:把商品编号和月份连成「SP001-12」这样的新关键字,一列代表两个条件。

=SUMIF(入库单!J:J,M2&"-"&N2,入库单!G:G)

对辅助列 J 做普通 SUMIF:M2 放商品编号、N2 放月份数字,连接后与辅助列匹配。

💡 提示:

  • 连接符建议用「-」这类不容易撞车的分隔符,避免「1月2日」和「12月」连出同样的字符串
  • 辅助列记得写表头,别让它混进统计区域

SUMIFS:多条件求和的正解

Excel 2007 以上直接给了多条件求和函数:=SUMIFS(求和区域,条件区域1,条件1,[条件区域2,条件2,...])。

注意它与 SUMIF 最大的不同:求和区域排到了第 1 位,后面条件区域和条件成对出现,最多 127 对。

进销存刚需示例:SP001 在 12 月入了多少货?三个条件牌一起上:编号、起始日期、截止日期。

=SUMIFS(入库单!G:G,入库单!C:C,A2,入库单!B:B,">=2024-12-1",入库单!B:B,"<2025-1-1")

第 1 参数是要加总的数量列 G;之后三对条件依次限定:商品编号等于 A2、日期在 12 月 1 日及以后、日期在 2025 年 1 月 1 日之前——正好框住 12 月。

💡 提示:

  • 「求和区域在第 1 位」是 SUMIF 与 SUMIFS 最容易写混的地方,写完先检查第一个参数
  • 各条件区域与求和区域的行数必须一致

顺手上一道保险:出库不能超库存

复习第 5 讲的数据有效性,用 SUMIF 给出库单上一道防超卖的锁。选中出库数量列,【数据-数据验证】选「自定义」,输入:=SUMIF(F:F,F3,G:G)<=SUMIF(A:A,F3,B:B)。

意思是:同一商品在出库表中已录数量之和(含本行)不能超过库存表里它的现有数量——超卖的那一行当场录不进去。库存台账建好之后,这道防线的另一半(事后监控)就由台账的状态列接管。

=SUMIF(F:F,F3,G:G)<=SUMIF(A:A,F3,B:B)

左边:出库表中该商品的数量合计;右边:库存表中该商品的数量。验证结果必须为 TRUE 才允许录入。

💡 提示:

  • 这道验证依赖「库存表」的数量及时维护,下一节建好台账后可以换成对台账当前库存的校验

实战演练

这一讲是整个课程的「心脏手术」:新建「库存台账」工作表,30 个商品一行一个,用两列 SUMIF 把入库单、出库单几百行流水实时汇成累计数,再按「期初 + 入库 - 出库」算出当前库存,配上第 8 讲学过的 IF 判断亮出补货状态。做完这一讲,你的系统第一次拥有了「实时库存」——流水一变,台账秒变。可先在右侧练习数据(源讲义工作簿)里试手感,然后回到自己的进销存工作簿正式建造。

  1. 建台账骨架 — 新建工作表并命名为「库存台账」,A1:J1 依次输入表头:商品编号、商品名称、类别、单位、期初库存、累计入库、累计出库、当前库存、安全库存、库存状态。A2 输入 =商品档案!A2,下拉到 A31,把 30 个编号引进来。
  2. 引用基础信息列 — B2 输入 =商品档案!B2(名称)、C2 输入 =商品档案!C2(类别)、D2 输入 =商品档案!D2(单位)、E2 输入 =商品档案!H2(期初库存)、I2 输入 =商品档案!G2(安全库存),全部下拉 30 行。这些直接引用是临时桥,下一讲学 VLOOKUP 后可以升级为按编号自动带出。
  3. 累计入库列 — F2 输入 =SUMIF(入库单!C:C,A2,入库单!G:G),下拉到 F31。注意核对列位:C 列是入库单的商品编号、G 列是数量,对照你自己工作簿的表头确认无误。
  4. 累计出库列 — G2 输入 =SUMIF(出库单!C:C,A2,出库单!G:G),下拉到 G31。公式结构与累计入库完全一致,只是换了表名——这正是两张单据结构对称的好处。
  5. 当前库存列 — H2 输入 =E2+F2-G2,下拉。期初加累计入库减累计出库。挑两三个商品,去入库单、出库单里手工筛选加总一遍,核对 H 列数字是否一致。
  6. 库存状态列 — J2 输入 =IF(I2=0,"缺货",IF(H2<=I2,"⚠补货","正常")),下拉 30 行。把第 8 讲的 IF 嵌套直接搬进台账:安全库存为 0 显示「缺货」,当前库存不高于安全库存显示「⚠补货」,否则「正常」。
  7. 压力测试:台账是活的 — 在出库单加录一行大数量出库(比如把某商品出库 9999),回到台账看它的当前库存变负、「⚠补货」亮起;然后撤销这行测试数据。体会一遍:台账不需要任何手工更新,流水变它就变。

在线练习

下面的表格可以直接编辑,照着演练步骤在本页练习;需要菜单操作的步骤请下载配套练习文件,在自己电脑的 Excel 中完成。

表格加载中…

验收清单

逐项自查,全部通过即完成本讲:

  • ☐ 台账 30 行的 F、G 列全部有数值,无 #N/A 等错误值
  • ☐ 至少抽查 1 个商品:入库单筛选加总的数量与 F 列一致
  • ☐ H 列没有负数(若出现负数,先查出库单是否超卖,或商品编号两表拼写不一致)
  • ☐ 压力测试通过:加录超卖流水后 J 列状态立刻反映异常,测试数据已撤销
  • ☐ 能口头说出 SUMIF 与 SUMIFS 的参数顺序区别,以及当前库存公式的三段含义
  • ☐ 出库数量列已设置防超卖的数据有效性(自定义公式)并测试过拦截