PMC群:49周订单规则分配专题 - 1
优秀创作者
目标:根据订单中的零件类型(B列),对每个零件的订单数量(C列)进行条件求和。具体规则为:!
当某零件首次出现时,返回 0
后续每次出现该零件时,返回该零件此前所有出现次数的数量总和(不包括当前行的数量)
核心函数:
| 📌 | 1. FILTER 是前置筛选工具
2. MAP 是逐行处理的核心函数
3. OFFSET 动态获取历史区域
4. SUM + TAKE 实现排除当前值
5. LET 提升公式可读性
6. DROP 用于删除指定位置的数据
|
方法一:使用 MAP + FILTER + OFFSET(简洁型)
=MAP(B2:B8,LAMBDA(x,LET(a,FILTER(OFFSET(B2:x,,1),B2:x=x),SUM(a)-TAKE(a,-1))))| 📌 | 1️⃣ MAP(B2:B8, LAMBDA(x, ... ))
2️⃣ LET(a, ..., SUM(a) - TAKE(a, -1))
3️⃣ OFFSET(B2:x,,1)
📌 举例:
⚠️ 注意:OFFSET 在这里被用作动态引用区域,配合 FILTER 使用。 4️⃣ FILTER(OFFSET(B2:x,,1), B2:x = x)
📌 举例(假设当前行是第5行,x = "A"):
5️⃣ SUM(a) - TAKE(a, -1)
📌 继续上例:
✅ 对于首次出现的零件(如第一个 "C"):
|
特点:
简洁直观,利用 MAP 对每一行独立处理
使用 FILTER 获取同零件的所有历史数据
SUM(...)-TAKE(...,-1) 实现累计求和(排除当前行)
依赖 OFFSET,适用于 Excel 365 环境
优点:
代码简短,易于理解
性能良好,适合中等规模数据集
缺点:
需要正确处理 OFFSET 的引用逻辑
方法二:使用 MAP + SUMIFS + COUNTIF(直接计算型)
=MAP(B2:.B100,C2:.C100,LAMBDA(X,Y,LET(B,B2:X,C,C2:Y,IF(COUNTIF(B,X)=1,0,SUMIFS(C,B,X)-Y))))| 📌 | 1️⃣ MAP(B2:B100, C2:C100, LAMBDA(X,Y, ... )) 作用:对 B2:B100 和 C2:C100 中的每一行(即每个零件和数量)依次执行一个自定义操作。
2️⃣ LET(B, B2:X, C, C2:Y, IF(COUNTIF(B,X)=1, 0, SUMIFS(C,B,X)-Y)) 作用:定义临时变量 B 和 C,分别表示从 B2 到当前行 X 的零件列和数量列,避免重复引用。
3️⃣ COUNTIF(B, X) 作用:统计在区域 B(即 B2 到当前行)中,零件 X 出现的次数。
4️⃣ SUMIFS(C, B, X) 作用:在数量列 C 中,筛选出所有零件等于 X 的行,并求和。
5️⃣ SUMIFS(C, B, X) - Y 作用:计算该零件在当前行之前的所有数量总和。
6️⃣ IF(COUNTIF(B,X)=1, 0, SUMIFS(C,B,X)-Y) 作用:综合判断是否首次出现。
|
特点:
直接利用 SUMIFS 和 COUNTIF 进行条件统计
COUNTIF 判断是否为首行,是则返回 0
SUMIFS(...)-Y 实现累计求和(排除当前行)
优点:
不依赖动态数组函数,兼容性好
直观易懂,便于调试
缺点:
可能需要多次遍历数据,性能稍低
方法三:使用 REDUCE + VSTACK + FILTER(逐步累加型)
=DROP(REDUCE("",B2:B8,LAMBDA(X,Y,VSTACK(X,LET(B,Y,SUM(FILTER(C1:OFFSET(B,-1,1),B1:OFFSET(B,-1,)=B,0)))))),1)| 📌 | 1️⃣ REDUCE("", B2:B8, LAMBDA(X, Y, ... )) 作用:对 B2:B8 中的每一行逐个处理,从初始值 "" 开始,通过累积方式构建一个结果数组。
2️⃣ VSTACK(X, ...) 作用:将当前累积结果 X 与新计算出的值垂直拼接(即“追加一行”)。
3️⃣ LET(B, Y, SUM(FILTER(C1:OFFSET(B,-1,1), B1:OFFSET(B,-1,) = B, 0))) 作用:为当前零件 Y 计算其此前所有出现的数量之和(不含当前行)。
4️⃣ FILTER(C1:OFFSET(B,-1,1), B1:OFFSET(B,-1,) = B, 0) 作用:在当前行之前的所有行中,筛选出零件等于当前零件 B 的那些数量。
5️⃣ SUM(FILTER(...)) 作用:对筛选出的历史数量求和。
6️⃣ DROP(..., 1) 作用:去掉 REDUCE 生成结果中的第一个元素(即初始空值 "" 对应的占位行)。
✅ 整体逻辑总结: 该公式通过 REDUCE 逐行遍历零件列,对每个零件动态查看其上方所有行中同名零件的数量,并求和。首次出现时上方无同名数据,SUM=0;后续出现时自动累加历史值。最后用 DROP 去掉初始空行,得到与数据行数一致的累计结果列。 |
特点:
逐行累积,使用 REDUCE 构建最终结果
每次遇到新零件时,通过 FILTER 获取其历史数据并求和
DROP(...,1) 去除初始值
优点:
适合需要逐行累积的应用场景
结果自然形成动态数组
缺点:
代码较长,不易于初学者理解
多次调用 FILTER,可能影响性能