PMC48周:订单整理专题 - 2

Lv.2潜力创作者
48-3 二维转一维 —— 将筛选后的重复任务序列转换为单列垂直列表
在订单分配系统中,常常需要将多行多列的重复任务号(如 E10:K10 区域)转换为一个单一的纵向列表,以便后续用于排序、分发或导入其他系统。
本题目标为:
🔧 公式解析与对比
✅ 方法一:使用 TOCOL + FILTER + 布尔逻辑(推荐)
= LET(
C, C2:C8,
TOCOL(FILTER(IF(C >= SEQUENCE(, MAX(C)), A2:A8, ""), B2:B8 = F2), 3)
)✨ 解析步骤:
C = C2:C8:定义数量列
MAX(C):获取最大数量(如 13),用于生成序列
SEQUENCE(, MAX(C)):生成水平序列 [1,2,...,13]
IF(C >= SEQUENCE(...), A2:A8, ""):
若当前数量 ≥ 序列值 → 返回对应任务号
否则返回空字符串(避免干扰)
FILTER(..., B2:B8 = F2):
筛选出零件等于 F2 的所有任务号(含重复)
TOCOL(..., 3):
将二维数组转换为一维列
参数 3 表示:忽略空白单元格,仅保留有效值
✅ 优点:
性能最优,适合大数据集
使用 TOCOL 实现高效维度转换
代码简洁,逻辑清晰
❌ 缺点:
依赖 TOCOL 函数(WPS/Excel 365 支持)
不支持非连续数据
📌 适用场景:
✅ 方法二:使用 TOCOL + TAKE + 分步处理(通用型)
excel编辑
I2 = LET(
A, FILTER(A2:C8, B2:B8 = F2),
TOCOL(IF(TAKE(A,,-1) >= SEQUENCE(, MAX(TAKE(A,,-1))), TAKE(A,,1), ""), 3)
)✨ 解析步骤:
A = FILTER(A2:C8, B2:B8 = F2):一次性筛选出匹配零件的所有数据
TAKE(A,,-1):提取数量列(即 C 列)
MAX(...):获取最大数量
SEQUENCE(, MAX(...)):生成水平序列
IF(数量 >= 序列, 任务号, ""):按数量重复任务号
TAKE(A,,1):提取任务号列(即 A 列)
TOCOL(..., 3):将结果转为单列,忽略空白
✅ 优点:
分步处理,逻辑清晰易懂
可读性强,便于调试
支持动态数组
❌ 缺点:
代码稍长,重复引用较多
📌 适用场景:
✅ 方法三:使用 TOCOL + FILTER + 空值过滤(兼容性强)
excel编辑
I2 = LET(
A, A2:A8,
B, B2:B8,
C, C2:C8,
D, TOCOL(FILTER(IF(C >= SEQUENCE(, MAX(C)), A, 0), B2:B8 = F2), , FALSE),
FILTER(D, D <> 0)
)✨ 解析步骤:
A, B, C:分别定义任务号、零件、数量列
IF(C >= SEQUENCE(...), A, 0):用 0 替代无效值
FILTER(..., B2:B8 = F2):筛选匹配零件的数据
TOCOL(..., , FALSE):将二维数组转为一维,不忽略空白(但包含 0)
FILTER(D, D <> 0):再次过滤掉 0,只保留有效任务号
✅ 优点:
不依赖 TOCOL 的参数 3
兼容性更强,适用于旧版环境
逻辑严谨,适合复杂场景
❌ 缺点:
需两次过滤,性能略低
代码较长,不易理解
📌 适用场景:
📌 核心知识点总结
编号 | 知识点 | 说明 |
1 | 二维转一维的核心是 TOCOL | 将多行多列数据压缩为单列 |
2 | TOCOL 的参数 3 表示忽略空白 | 自动跳过空值,仅保留有效数据 |
3 | FILTER 是前置筛选工具 | 必须先根据零件类型筛选数据 |
4 | SEQUENCE 生成索引序列 | 用于构造布尔矩阵,实现向量化重复 |
5 | LET 提升公式可读性 | 定义变量避免重复引用,尤其适用于复杂公式 |
6 | TAKE 提取指定列 | 如 TAKE(A,,-1) 表示最后一列(数量),TAKE(A,,1) 表示第一列(任务号) |
🎯 实际应用建议
优先推荐使用方法一(TOCOL + FILTER + 布尔逻辑)
✅ 代码最短,性能最优
✅ 适合大规模数据处理
✅ 符合现代 Excel 开发规范
若需清晰分步,可用方法二(分步处理)
✅ 易于理解和调试
✅ 适合团队协作
若需兼容旧版,可用方法三(双重过滤)
✅ 不依赖高级参数
✅ 逻辑严谨,适合生产环境
注意约束条件:
✅ 输入零件必须存在于 B 列
✅ 数量为正整数
✅ 输出结果为动态数组
✅ 无额外空行或乱码
🧩 示例效果说明
一维 |
WK-003 |
WK-003 |
WK-003 |
WK-003 |
WK-003 |
WK-005 |
WK-005 |
WK-005 |
WK-005 |
WK-005 |
此操作是订单分配系统的关键一步。掌握这些技巧,不仅能高效生成任务列表,还能迁移到其他业务场景(如工单拆分、生产排程等),大幅提升自动化能力。
📚 小结口诀
TOCOL来搞定;
先筛再重复,
最后竖着走;
参数三最妙,
空白全忽略。”
48-4 筛选指定零件任务数量并按规则累计求和 —— 动态生成累计数量序列
在订单分配系统中,除了生成任务列表外,还需对特定零件的任务数量进行筛选与累计求和,以支持后续分批处理或进度跟踪。
本题目标为:
第一条记录为 0
第二条记录为第一个匹配任务的数量
第三条记录为前两个匹配任务的累计和
最后一条记录被丢弃(即不显示)
例如:
零件 “C” 对应任务数量:8, 9, 25
输出结果应为:0, 8, 17
🔧 公式解析与对比
✅ 方法一:使用 SCAN + FILTER + VSTACK + DROP(推荐)
= VSTACK(0, DROP(SCAN(, FILTER(C2:C5, B2:B5 = F2), SUM), -1))✨ 解析步骤:
FILTER(C2:C5, B2:B5 = F2):筛选出零件等于 F2 的数量列
如 F2="C" → 返回 {8, 9, 25}
SCAN(, ..., SUM):
使用 SUM 作为累加函数
从第一个值开始逐项相加
结果为:{8, 17, 42}
VSTACK(0, ...):在前面添加 0,得到 {0, 8, 17, 42}
DROP(..., -1):删除最后一条记录(42),最终结果为 {0, 8, 17}
✅ 优点:
逻辑清晰,分步处理
使用 SCAN 实现高效累计
性能高,适合大数据集
❌ 缺点:
依赖 SCAN 函数(WPS/Excel 365 支持)
不支持非连续数据
📌 适用场景:
✅ 方法二:使用 DROP + VSTACK + 固定筛选条件(简化版)
excel编辑
I2 = DROP(VSTACK(0, SCAN(0, FILTER(C2:C5, B2:B5 = "C"), SUM)), -1)✨ 解析步骤:
FILTER(C2:C5, B2:B5 = "C"):直接筛选零件为 “C” 的数量
SCAN(0, ..., SUM):从 0 开始累计求和
结果为:{0, 8, 17, 42}
VSTACK(0, ...):已包含初始值
DROP(..., -1):删除最后一条记录
✅ 优点:
代码简洁,性能优秀
直接写死零件名称,适用于固定查询
❌ 缺点:
不支持动态零件输入(需手动修改)
📌 适用场景:
✅ 方法三:使用 LET + INDEX + SCAN + VSTACK(高级型)
excel编辑
I2 = LET(
A, FILTER(C2:C5, B2:B5 = "C"),
INDEX(SCAN(0, VSTACK(0, A), LAMBDA(X, Y, X + Y)), SEQUENCE(ROWS(A)))
)✨ 解析步骤:
A = FILTER(C2:C5, B2:B5 = "C"):定义筛选后的数量数组
VSTACK(0, A):在前面添加 0,形成 {0, 8, 9, 25}
SCAN(0, ..., LAMBDA(X,Y,X+Y)):
使用自定义 lambda 函数实现累加
结果为:{0, 8, 17, 42}
SEQUENCE(ROWS(A)):生成行数序列 {1,2,3}
INDEX(..., ...):提取对应位置的值,得到 {0, 8, 17}
✅ 优点:
完全控制输出位置
使用 LAMBDA 提升灵活性
可扩展性强
❌ 缺点:
代码较长,不易理解
性能略低(因使用 INDEX 和 SEQUENCE)
📌 适用场景:
📌 核心知识点总结
编号 | 知识点 | 说明 |
1 | FILTER 是前置筛选工具 | 必须先根据零件类型筛选数据 |
2 | SCAN 是累计计算的核心函数 | 用于实现逐项累加,返回中间结果 |
3 | VSTACK 用于垂直拼接 | 将初始值 0 与累计结果合并 |
4 | DROP 用于删除指定位置的数据 | 如 DROP(..., -1) 删除最后一行 |
5 | LET 提升公式可读性 | 定义变量避免重复引用,尤其适用于复杂公式 |
6 | INDEX + SEQUENCE 控制输出范围 | 可精确提取所需行 |
🎯 实际应用建议
优先推荐使用方法一(SCAN + FILTER + VSTACK + DROP)
✅ 逻辑清晰,性能最优
✅ 适合大规模数据处理
✅ 符合现代 Excel 开发规范
若需固定零件分析,可用方法二(简化版)
✅ 代码最短,效率高
✅ 适合快速查看
若需灵活控制输出,可用方法三(LET + INDEX)
✅ 可扩展性强
✅ 适合高级用户
注意约束条件:
✅ 输入零件必须存在于 B 列
✅ 数量为正整数
✅ 输出结果为动态数组
✅ 第一条记录为 0
✅ 最后一条记录被丢弃
🧩 示例效果说明
数量 |
0 |
8 |
17 |
此操作是订单分配系统的关键一步。掌握这些技巧,不仅能高效生成任务列表,还能迁移到其他业务场景(如库存预警、生产进度跟踪等),大幅提升自动化能力。
📚 小结口诀
SCAN来搞定;
先加零开头,
最后一条扔;
VSTACK拼起来,
DROP删干净。”