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)), ...) 作用:定义三个变量,提升公式可读性和复用性。
2️⃣ MAP(a, b, c, LAMBDA(x, y, z, ... )) 作用:对 a、b、c 三个数组的每一组对应元素同时进行处理。
3️⃣ INDEX(a, 1):INDEX(a, z) 作用:动态构造从第1行到当前行 z 的零件子区域。
4️⃣ COUNTIF(INDEX(a,1):INDEX(a,z), x) = 1 作用:判断当前零件 x 在“从开头到当前行”中是否为首次出现。
5️⃣ (a = x) * (c < z) 作用:构造一个布尔掩码,用于筛选“当前零件 x 且行号小于当前行”的所有行。
6️⃣ FILTER(b, (a = x) * (c < z)) 作用:从数量列 b 中,提取出同零件且在当前行之前的所有数量。
7️⃣ SUM(FILTER(...)) 作用:对上述筛选出的历史数量求和,得到“此前累计值”。
8️⃣ IF(COUNTIF(...) = 1, 0, SUM(...)) 作用:综合判断并返回结果。
9️⃣ TAKE(..., COUNTA(B2:B100)) 作用:截取最终结果的前 N 行,其中 N = 实际非空零件数。
|
特点:
高度自定义,使用 SEQUENCE 和 MAP 提供灵活控制
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定义好,
一行写完它。”
此操作是订单管理系统中常见的分组累计统计任务。掌握这些技巧,不仅能高效完成数据处理,还能迁移到其他业务场景(如库存预警、生产进度跟踪等),大幅提升自动化能力。
✅ 最终结论: