PMC群:49周订单规则分配专题 - 2

古哥计划
古哥计划

优秀创作者

方法四:使用 LET + SEQUENCE + MAP(高级控制型)

=TAKE(LET(a,B2:B100,b,C2:C100,c,SEQUENCE(ROWS(a)),MAP(a,b,c,LAMBDA(x,y,z,IF(COUNTIF(INDEX(a,1):INDEX(a,z),x)=1,0,SUM(FILTER(b,(a=x)*(c<z))))))),COUNTA(B2:B100))
📌

1️⃣ LET(a, B2:B100, b, C2:C100, c, SEQUENCE(ROWS(a)), ...)

作用:定义三个变量,提升公式可读性和复用性。

  • a = B2:B100 → 零件列(从第2行到第100行)

  • b = C2:C100 → 数量列(对应零件的数量)

  • c = SEQUENCE(ROWS(a)) → 生成序号数组 {1;2;3;…;99},表示每行在 a 中的相对位置(第1行为1,第2行为2,依此类推)


2️⃣ MAP(a, b, c, LAMBDA(x, y, z, ... ))

作用:对 a、b、c 三个数组的每一组对应元素同时进行处理。

  • x = 当前行的零件(来自 a)

  • y = 当前行的数量(来自 b)

  • z = 当前行的序号(来自 c,即这是第几行数据)

  • 相当于“逐行遍历”,并能知道当前是第几行(z),便于定位历史范围


3️⃣ INDEX(a, 1):INDEX(a, z)

作用:动态构造从第1行到当前行 z 的零件子区域。

  • INDEX(a,1) → a 的第1个元素(即 B2)

  • INDEX(a,z) → a 的第 z 个元素(即当前行的零件)

  • 合起来等价于 B2 到当前行的零件范围(如第3行时,就是 B2:B4)


4️⃣ COUNTIF(INDEX(a,1):INDEX(a,z), x) = 1

作用:判断当前零件 x 在“从开头到当前行”中是否为首次出现

  • 如果等于 1 → 是第一次 → 返回 0

  • 如果大于 1 → 已出现过 → 进入累计逻辑


5️⃣ (a = x) * (c < z)

作用:构造一个布尔掩码,用于筛选“当前零件 x 且行号小于当前行”的所有行。

  • a = x → 所有等于当前零件的行(TRUE/FALSE)

  • c < z → 所有在当前行之前的行(TRUE/FALSE)

  • 两者相乘(*)实现“AND”逻辑,结果为 1(TRUE)的位置即为符合条件的历史行


6️⃣ FILTER(b, (a = x) * (c < z))

作用:从数量列 b 中,提取出同零件且在当前行之前的所有数量。

  • 例如:当前是第5行(z=5),x="C",则只取前4行中零件为 "C" 的数量


7️⃣ SUM(FILTER(...))

作用:对上述筛选出的历史数量求和,得到“此前累计值”。

  • 若无历史记录(首次出现),FILTER 返回空,SUM 返回 0(但此情况已被前面的 IF 拦截)


8️⃣ IF(COUNTIF(...) = 1, 0, SUM(...))

作用:综合判断并返回结果。

  • 首次出现 → 返回 0

  • 非首次 → 返回历史累计和


9️⃣ TAKE(..., COUNTA(B2:B100))

作用:截取最终结果的前 N 行,其中 N = 实际非空零件数。

  • 因为 a 定义为 B2:B100(固定99行),但实际数据可能不足100行

  • COUNTA(B2:B100) 统计非空单元格数量,确保结果只包含有效行,避免多余零或错误值

特点:

  • 高度自定义,使用 SEQUENCEMAP 提供灵活控制

  • COUNTIF 判断是否为首行,是则返回 0

  • SUM(FILTER(...)) 实现累计求和(仅包含之前的数据)

优点:
  • 完全控制输出范围和顺序

  • 支持复杂逻辑扩展

缺点:
  • 代码较复杂,理解难度较大

  • 需要较高的 Excel 函数掌握程度


核心知识点总结

编号

知识点

说明

1

FILTER 是前置筛选工具

必须先根据零件筛选出同类型的历史数据,才能进行累计计算

2

MAP 是逐行处理的核心函数

对每一行独立执行逻辑,适用于“按行判断并计算”的场景

3

OFFSET 动态获取历史区域

结合 B2:x 等动态引用,实现当前行以上所有数据的提取

4

SUM + TAKE 实现排除当前值

SUM(a) - TAKE(a, -1) 剔除当前行的数量,仅保留历史总和

5

LET 提升公式可读性

定义变量避免重复引用,尤其适用于复杂嵌套结构

6

DROP 用于删除指定位置的数据

DROP(..., 1) 删除初始空值,确保输出结果从第一行开始


💡 实际应用建议

  • 优先推荐使用方法一(MAP + FILTER):代码简洁、性能高,适合日常业务分析

  • 若需兼容旧版 Excel,可用方法二(SUMIFS + COUNTIF):不依赖动态数组,但逻辑稍显冗长

  • 对于大数据集或复杂逻辑,考虑方法四(SEQUENCE + MAP):灵活可控,适合高级用户

  • ⚠️ 注意:所有方法均需保证数据连续且无空行,否则可能导致错误或结果偏差

如需进一步拓展功能(如按人员分配、时间排序、状态标记等),可在该基础上继续构建模型。

📚 小结口诀

筛选再累计,
MAP来搞定;
历史全取走,
当前减掉它;
LET定义好,
一行写完它。

此操作是订单管理系统中常见的分组累计统计任务。掌握这些技巧,不仅能高效完成数据处理,还能迁移到其他业务场景(如库存预警、生产进度跟踪等),大幅提升自动化能力。


最终结论

每个零件独立累计,首次出现返回 0,后续依次累加其历史数量,通过 MAPFILTEROFFSET 等函数组合实现精准控制。
广东省
浏览 195
1
1
分享
1 +1
1 +1
全部评论