PMC48周:订单整理专题 - 2

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

Lv.2潜力创作者

48-3 二维转一维 —— 将筛选后的重复任务序列转换为单列垂直列表

在订单分配系统中,常常需要将多行多列的重复任务号(如 E10:K10 区域)转换为一个单一的纵向列表,以便后续用于排序、分发或导入其他系统。

本题目标为:

将根据零件类型筛选并重复生成的任务号(如 WK-003 重复5次,WK-005 重复6次),从横向排列的二维数组转换为一列垂直的动态数组

🔧 公式解析与对比

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

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

解析步骤:

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

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

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

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

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

  • 否则返回空字符串(避免干扰)

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

  • 筛选出零件等于 F2 的所有任务号(含重复)

  1. 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)
)

解析步骤:

  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 列)

  1. 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)
)

解析步骤:

  1. A, B, C:分别定义任务号、零件、数量列

  1. IF(C >= SEQUENCE(...), A, 0):用 0 替代无效值

  1. FILTER(..., B2:B8 = F2):筛选匹配零件的数据

  1. TOCOL(..., , FALSE):将二维数组转为一维,不忽略空白(但包含 0

  1. 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) 表示第一列(任务号)


🎯 实际应用建议

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

代码最短,性能最优

适合大规模数据处理

符合现代 Excel 开发规范

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

易于理解和调试

适合团队协作

  1. 若需兼容旧版,可用方法三(双重过滤)

不依赖高级参数

逻辑严谨,适合生产环境

  1. 注意约束条件

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

  • 数量为正整数

  • 输出结果为动态数组

  • 无额外空行或乱码


🧩 示例效果说明

在 I2 单元格输入上述任一公式后,当 F2 输入 “C” 时,结果如下:

一维

WK-003

WK-003

WK-003

WK-003

WK-003

WK-005

WK-005

WK-005

WK-005

WK-005

成功将横向重复的任务号转换为纵向列表,且自动去除了空白项。

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


📚 小结口诀

“二维变一维,
TOCOL来搞定;
先筛再重复,
最后竖着走;
参数三最妙,
空白全忽略。”

48-4 筛选指定零件任务数量并按规则累计求和 —— 动态生成累计数量序列

在订单分配系统中,除了生成任务列表外,还需对特定零件的任务数量进行筛选与累计求和,以支持后续分批处理或进度跟踪。

本题目标为:

根据 F2 单元格输入的零件(如 “C”),筛选出所有该零件的任务数量,并按以下规则生成一个累计求和序列
  1. 第一条记录为 0

  1. 第二条记录为第一个匹配任务的数量

  1. 第三条记录为前两个匹配任务的累计和

  1. 最后一条记录被丢弃(即不显示)

例如:

  • 零件 “C” 对应任务数量:8, 9, 25

  • 输出结果应为:0, 8, 17


🔧 公式解析与对比

方法一:使用 SCAN + FILTER + VSTACK + DROP(推荐)

 = VSTACK(0, DROP(SCAN(, FILTER(C2:C5, B2:B5 = F2), SUM), -1))

解析步骤:

  1. FILTER(C2:C5, B2:B5 = F2):筛选出零件等于 F2 的数量列

  • 如 F2="C" → 返回 {8, 9, 25}

  1. SCAN(, ..., SUM)

  • 使用 SUM 作为累加函数

  • 从第一个值开始逐项相加

  • 结果为:{8, 17, 42}

  1. VSTACK(0, ...):在前面添加 0,得到 {0, 8, 17, 42}

  1. 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)

解析步骤:

  1. FILTER(C2:C5, B2:B5 = "C"):直接筛选零件为 “C” 的数量

  1. SCAN(0, ..., SUM):从 0 开始累计求和

  • 结果为:{0, 8, 17, 42}

  1. VSTACK(0, ...):已包含初始值

  1. 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)))
)

解析步骤:

  1. A = FILTER(C2:C5, B2:B5 = "C"):定义筛选后的数量数组

  1. VSTACK(0, A):在前面添加 0,形成 {0, 8, 9, 25}

  1. SCAN(0, ..., LAMBDA(X,Y,X+Y))

  • 使用自定义 lambda 函数实现累加

  • 结果为:{0, 8, 17, 42}

  1. SEQUENCE(ROWS(A)):生成行数序列 {1,2,3}

  1. INDEX(..., ...):提取对应位置的值,得到 {0, 8, 17}

优点

  • 完全控制输出位置

  • 使用 LAMBDA 提升灵活性

  • 可扩展性强

缺点

  • 代码较长,不易理解

  • 性能略低(因使用 INDEXSEQUENCE

📌 适用场景

高级用户或需灵活控制输出的场景

📌 核心知识点总结

编号

知识点

说明

1

FILTER 是前置筛选工具

必须先根据零件类型筛选数据

2

SCAN 是累计计算的核心函数

用于实现逐项累加,返回中间结果

3

VSTACK 用于垂直拼接

将初始值 0 与累计结果合并

4

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

DROP(..., -1) 删除最后一行

5

LET 提升公式可读性

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

6

INDEX + SEQUENCE 控制输出范围

可精确提取所需行


🎯 实际应用建议

  1. 优先推荐使用方法一SCAN + FILTER + VSTACK + DROP

逻辑清晰,性能最优

适合大规模数据处理

符合现代 Excel 开发规范

  1. 若需固定零件分析,可用方法二(简化版)

代码最短,效率高

适合快速查看

  1. 若需灵活控制输出,可用方法三LET + INDEX

可扩展性强

适合高级用户

  1. 注意约束条件

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

  • 数量为正整数

  • 输出结果为动态数组

  • 第一条记录为 0

  • 最后一条记录被丢弃


🧩 示例效果说明

在 I2 单元格输入上述任一公式后,当 F2 输入 “C” 时,结果如下:

数量

0

8

17

成功实现了对指定零件任务数量的筛选与累计求和,并符合所有约束条件。

此操作是订单分配系统的关键一步。掌握这些技巧,不仅能高效生成任务列表,还能迁移到其他业务场景(如库存预警、生产进度跟踪等),大幅提升自动化能力。


📚 小结口诀

“筛选再累计,
SCAN来搞定;
先加零开头,
最后一条扔;
VSTACK拼起来,
DROP删干净。”
广东省
浏览 699
1
7
分享
7 +1
2
1 +1
全部评论 2
 
恰同学少年
大大的赞,太有用了
· 黑龙江省
回复
 
周周见
大大的赞,太有用了
· 湖南省
回复