PMC48周:订单整理专题 - 1

古哥计划
古哥计划 Lv.2 潜力创作者KVP

Lv.2潜力创作者

48-1 按数量重复任务号 —— 根据订单数量动态生成重复任务序列

在订单分配系统中,一个常见的需求是:

将每个任务号根据其对应的“数量”字段进行多次重复输出,以便后续按条目分发给工人或设备。

例如:

  • 任务 WK-001 数量为 8 → 需重复输出 8 次

  • 任务 WK-002 数量为 9 → 需重复输出 9 次

本题目标为:在 E2 单元格输入一个公式,实现自动将 A 列任务号按 C 列数量重复填充到多列中,结果如图所示。


🔧 公式解析与对比

方法一:使用 SEQUENCE + 布尔逻辑(推荐)

 =IF(C2:C8>=SEQUENCE(,MAX(C2:C8)),A2:A8,"")

解析步骤:

  1. MAX(C2:C8):获取最大数量(如 13),确定重复列数

  1. SEQUENCE(, MAX(C2:C8)):生成水平序列 [1,2,3,...,13]

  1. C2:C8 >= SEQUENCE(...):逐行比较,若当前数量 ≥ 序列值 → 返回 TRUE

  • 8 >= [1,2,3,...,13][TRUE,TRUE,...,TRUE,FALSE,...](前8个为真)

  1. IF(..., A2:A8, ""):当条件为真时返回对应任务号,否则为空

  1. 结果为动态数组,自动填充至所有列

优点

  • 纯向量化操作,无需循环或堆叠

  • 性能最优,适合大数据集

  • 代码最短,逻辑清晰

缺点

  • 依赖 SEQUENCE 函数(WPS/Excel 365 支持)

  • 不支持非连续重复(仅适用于等距填充)

📌 适用场景

数据量大、需快速生成重复序列的场景

方法二:使用 REDUCE + REPTARRAY(WPS专属)

E2 = DROP(REDUCE(0, A2:A8, LAMBDA(X, Y, IFNA(VSTACK(X, REPTARRAY(Y,, OFFSET(Y,,2))), ""))), 1)

解析步骤:

  1. OFFSET(Y,,2):获取当前行的“数量”列(即 C 列)

  1. REPTARRAY(Y,, OFFSET(Y,,2)):WPS 专属函数,将任务号 Y 重复指定次数

  1. VSTACK(X, ...):垂直堆叠上一次结果与当前重复结果

  1. REDUCE(0, A2:A8, ...):对每行依次处理

  1. DROP(...,1):去掉初始值 0

优点

  • 使用 WPS 特有函数 REPTARRAY,直接实现重复

  • 逻辑直观,易于理解

缺点

  • 仅适用于 WPS Office,不兼容 Excel

  • 性能略低于向量化方法

📌 适用场景

在 WPS 环境下开发,且希望代码简洁易读

方法三:使用 REDUCE + SEQUENCE + VSTACK(通用型)

excel编辑

E2 = IFNA(DROP(REDUCE("", A2:A8, LAMBDA(X, Y, VSTACK(X, IF(SEQUENCE(, OFFSET(Y,,2)), Y)))), 1), "")

解析步骤:

  1. OFFSET(Y,,2):获取当前行的数量

  1. SEQUENCE(, OFFSET(Y,,2)):生成长度等于数量的水平序列(如 8 → [1,2,3,...,8]

  1. IF(SEQUENCE(...), Y):将任务号 Y 重复填充到该序列长度

  1. VSTACK(X, ...):将新结果堆叠到已有结果上

  1. REDUCE("", A2:A8, ...):遍历所有任务号

  1. DROP(...,1):去掉初始空值

  1. IFNA(..., ""):防止错误显示

优点

  • 不依赖 WPS 专属函数,兼容性强

  • 可用于复杂逻辑扩展(如带条件重复)

缺点

  • 公式较长,调试困难

  • 性能较低(因使用 REDUCEVSTACK 多次堆叠)

📌 适用场景

跨平台环境,或需灵活控制重复逻辑的场景

📌 核心知识点总结

编号

知识点

说明

1

重复的核心是“数量”驱动

每个任务号的重复次数由其对应的“数量”决定

2

优先考虑向量化方案

使用 SEQUENCE + 布尔逻辑可实现一键批量处理,速度快

3

SEQUENCE 是生成索引的关键工具

可配合 >= 构造布尔矩阵,实现动态筛选

4

REDUCE 用于迭代处理数据

适合需要逐步累加结果的场景

5

VSTACK 实现垂直拼接

将多个数组纵向合并

6

REPTARRAY 是 WPS 的高效重复函数

可直接实现“重复 N 次”的功能

7

OFFSET 获取相对列数据

OFFSET(Y,,2) 表示当前行第3列(数量)


🎯 实际应用建议

  1. 优先推荐使用方法一SEQUENCE + 布尔逻辑)

代码最短,性能最优

适合大规模数据处理

符合现代 Excel 开发规范

  1. 若在 WPS 环境中,可用方法二REPTARRAY + REDUCE

直观易懂,开发效率高

适合初学者快速上手

  1. 若需跨平台兼容,可用方法三REDUCE + SEQUENCE

不依赖特殊函数

可扩展性强

  1. 注意约束条件

  • 数量为正整数

  • 输出结果应为动态数组

  • 重复次数等于“数量”列值

  • 无额外空行或乱码


🧩 示例效果说明

在 E2 单元格输入上述任一公式后,结果如下:

任务号

零件

数量

任务1

任务2

任务3

任务4

WK-001

A

4

WK-001

WK-001

WK-001

WK-001

WK-002

A

3

WK-002

WK-002

WK-002

WK-003

C

2

WK-003

WK-003

WK-004

B

2

WK-004

WK-004

WK-005

D

4

WK-005

WK-005

WK-005

WK-005

成功实现了按数量自动重复任务号,为后续订单分配提供基础数据。


📚 小结口诀

“重复任务看数量,
向量化法最高效;
SEQUENCE生成序,
布尔判断全搞定;
REDUCE来堆叠,
一行代码写完它。”

此操作是订单分配系统的基础环节。掌握这些技巧,不仅能高效生成任务列表,还能迁移到其他业务场景(如工单拆分、生产排程等),大幅提升自动化能力。

48-2 按订单数量筛选对应的工单任务号明细 —— 基于零件类型动态生成重复任务

在订单分配系统中,除了按数量重复任务号外,还常需根据特定零件类型筛选并输出对应的任务序列。本题目标为:

根据 F 列输入的“零件”(如 “C”),从原始数据中筛选出该零件的所有任务,并按其数量重复输出任务号。

例如:

  • 零件 “C” 对应任务 WK-003(数量5)和 WK-005(数量6)

  • 输出结果应为:WK-003 重复 5 次,WK-005 重复 6 次


🔧 公式解析与对比

方法一:使用 FILTER + SEQUENCE + 布尔逻辑(推荐)

 = LET(
    C, C2:C8,
    FILTER(IF(C >= SEQUENCE(, MAX(C)), A2:A8, 0), B2:B8 = F2)

解析步骤:

  1. C = C2:C8:定义数量列

  1. MAX(C):获取最大数量(如 13),用于生成序列

  1. SEQUENCE(, MAX(C)):生成水平序列 [1,2,...,13]

  1. IF(C >= SEQUENCE(...), A2:A8, 0)

  • 若当前数量 ≥ 序列值 → 返回对应任务号

  • 否则返回 0(作为占位符)

  1. FILTER(..., B2:B8 = F2)

  • 先筛选出零件等于 F2 的行

  • 再对这些行的结果进行过滤,保留有效任务号

优点

  • 先重复后筛选,逻辑清晰

  • 使用 FILTER 实现条件提取

  • 性能高,适合大数据集

缺点

  • 需要将无效值设为 0 以避免干扰

  • 不支持空值处理

📌 适用场景

数据质量良好、需快速生成筛选后重复序列的场景

方法二:使用 FILTER + 分步处理(通用型)

excel编辑

= LET(
    B, B2:B8 = F2,  // 筛选条件:零件是否等于F2
    C, FILTER(C2:C8, B),  // 获取筛选后数量
    A, FILTER(A2:A8, B),  // 获取筛选后任务号
    IF(C >= SEQUENCE(, MAX(C)), A, "")
)

解析步骤:

  1. B = B2:B8 = F2:判断每行零件是否匹配

  1. C = FILTER(C2:C8, B):只保留匹配行的数量

  1. A = FILTER(A2:A8, B):只保留匹配行的任务号

  1. SEQUENCE(, MAX(C)):生成最大数量长度的序列

  1. IF(C >= SEQUENCE(...), A, ""):对每个任务号按数量重复

优点

  • 分步处理,逻辑清晰易懂

  • 可读性强,便于调试

  • 支持动态数组

缺点

  • 代码稍长,重复引用较多

📌 适用场景

教学演示或团队协作开发,强调可维护性

方法三:使用 FILTER + TAKE + SEQUENCE(简洁型)

excel编辑

= LET(
    A, FILTER(A2:C8, B2:B8 = F2),  // 筛选符合条件的数据
    IF(TAKE(A,,-1) >= SEQUENCE(, MAX(TAKE(A,,-1))), TAKE(A,,1), "")
)

解析步骤:

  1. A = FILTER(A2:C8, B2:B8 = F2):一次性筛选出所有匹配行

  1. TAKE(A,,-1):提取数量列(即 C 列)

  1. MAX(...):获取最大数量

  1. SEQUENCE(, MAX(...)):生成水平序列

  1. IF(数量 >= 序列, 任务号, ""):按数量重复任务号

  1. TAKE(A,,1):提取任务号列(即 A 列)

优点

  • 代码最短,仅用一行完成

  • 使用 TAKE 提取列,避免重复引用

  • 性能优秀

缺点

  • 对初学者不友好

  • 需理解 TAKESEQUENCE 的组合逻辑

📌 适用场景

专业用户或追求极简公式的场景

📌 核心知识点总结

编号

知识点

说明

1

筛选是前置条件

必须先根据零件类型筛选数据,再进行重复操作

2

FILTER 是核心函数

实现条件提取,支持动态数组

3

SEQUENCE 生成索引序列

用于构造布尔矩阵,实现向量化重复

4

TAKE 提取指定列

TAKE(A,,-1) 表示最后一列,TAKE(A,,1) 表示第一列

5

LET 提升公式可读性

定义变量避免重复引用,尤其适用于复杂公式

6

布尔逻辑驱动重复

数量 >= 序列 构造真值表,控制输出


🎯 实际应用建议

  1. 优先推荐使用方法一FILTER + SEQUENCE + 布尔逻辑)

逻辑清晰,性能高

适合大规模数据处理

符合现代 Excel 开发规范

  1. 若需清晰分步,可用方法二(分步处理)

易于理解和调试

适合团队协作

  1. 若追求简洁,可用方法三TAKE + SEQUENCE

代码最短,效率高

适合高级用户

  1. 注意约束条件

  • 输入零件必须存在于 B 列

  • 数量为正整数

  • 输出结果为动态数组

  • 无额外空行或乱码


📚 小结口诀

“先筛后重是关键,
FILTER把关第一步;
SEQUENCE生成序,
布尔判断全搞定;
TAKE提取列,
一行代码写完它。”

此操作是订单分配系统的核心环节。掌握这些技巧,不仅能高效生成任务列表,还能迁移到其他业务场景(如生产排程、库存调拨等),大幅提升自动化能力。

广东省
浏览 1064
1
4
分享
4 +1
1
1 +1
全部评论 1
 
恰同学少年
大大的赞,太有用了
· 黑龙江省
回复