已收录

计划改一遍你就粘贴一遍?MPS拆行这个动作,一个公式管到退休

古哥计划
古哥计划 Lv.4 核心创作者KVP

Lv.4 核心创作者

🔥计划改一遍你就粘贴一遍?MPS拆行这个动作,一个公式管到退休

MPS排程做完,接下来的动作很固定:给每条生产计划挂子件。

WK-001这个产品有5个子件,那它就要拆成5行;WK-002有8个子件,拆8行。8条计划排下来,得拆成51行。

图1:MPS表——A:F列8条生产计划,F列子件数量分别是5/8/6/7/7/8/8/2

很多plan员的动作是复制粘贴,或者拉填充柄。

粘贴一次两次还行。排程天天改,计划一变,行数全变,你就天天在Excel里搬砖。

这个动作,一个动态数组公式就够了。我一口气写了3种写法,还做了2万行压力预估,最快的那种,连循环都没有。


一、先看需求:按数量重复,还要堆叠

源数据长这样:A列生产任务,B列存货编码,C列存货名称,D列订单数量,E列排程日期,F列子件数量。

要的结果:每条计划按F列的数字重复成n行,5列信息原样带过去,所有计划纵向堆在一起。

总行数=所有子件数量加起来,8条计划=5+8+6+7+7+8+8+2=51行。

这一步是BOM展开的前置动作——先把行数撑开,后面每行才好填不同的子件。


二、方法1:REDUCE压栈(最容易想到的写法)

=LET(d,A2:.F1000,x,REDUCE("",SEQUENCE(ROWS(d)),LAMBDA(a,i,LET(n,INDEX(d,i,6),IF(n,VSTACK(a,IF(SEQUENCE(n,1,1,0),INDEX(d,i,{1,2,3,4,5}))),a)))),DROP(x,1))

思路很直白:REDUCE遍历每条计划,拿到F列的子件数量n,用IF(SEQUENCE(n,1,1,0),整行5列)把这一行纵向广播成n行,再VSTACK压到一起,最后DROP掉种子行。

关键在SEQUENCE(n,1,1,0)这个写法——步长设0,生成的是n行全1的列向量,用它配合IF就能把一行变成n行。

这个写法有个坑:公式区域扩到1000行之后,空行的n是0,SEQUENCE(0)直接报错,整个公式废掉。

解法是在LAMBDA里加一层守卫:IF(n,压栈,原样返回)。IF是惰性求值,n为0时不触发SEQUENCE(0),空行直接跳过。


三、方法2:TOCOL扫描

=LET(a,A2:.A1000,b,B2:.B1000,c,C2:.C1000,d,D2:.D1000,e,E2:.E1000,y,F2:.F1000,m,MAX(y),HSTACK(TOCOL(IF(SEQUENCE(,m)<=y,a,NA()),3),TOCOL(IF(SEQUENCE(,m)<=y,b,NA()),3),TOCOL(IF(SEQUENCE(,m)<=y,c,NA()),3),TOCOL(IF(SEQUENCE(,m)<=y,d,NA()),3),TOCOL(IF(SEQUENCE(,m)<=y,e,NA()),3)))

这个思路妙在换了个角度。

先用IF(SEQUENCE(,MAX(y))<=y, X, NA())造一个矩阵:行是源记录,列是重复次数1到最大值,凡是列数不超过自己行数的格子,填源数据;超出的,填错误值#N/A。

然后TOCOL的第三个参数给3,扫描的时候自动忽略错误值——留下来的,正好就是每条计划重复出来的行。

重复和堆叠,一次扫描完成,全程没有循环。

5列数据就套5个TOCOL,用HSTACK拼起来。

图2:MPS表H:X列——三法并排输出,H:L方法1、N:R方法2、T:X方法3,各51行结果完全一致


四、方法3:区间定位(最快的写法,也是我最终用的骨架)

=LET(a,A2:.A1000,b,B2:.B1000,c,C2:.C1000,d,D2:.D1000,e,E2:.E1000,y,F2:.F1000,s,SCAN(,y,SUM),q,SEQUENCE(SUM(y)),HSTACK(XLOOKUP(q,s,a,,1),XLOOKUP(q,s,b,,1),XLOOKUP(q,s,c,,1),XLOOKUP(q,s,d,,1),XLOOKUP(q,s,e,,1)))

这个思路把问题彻底换掉了:重复行=区间归属。

第一层,SCAN(,y,SUM)对子件数量做累计和,得到每个源的组界终点:5、13、19、26、33、41、49、51。

第二层,SEQUENCE(SUM(y))生成1到51的输出行号。

第三层,XLOOKUP的第五个参数给1,升序模糊匹配:行号落在哪个组界区间里,就返回哪条计划。行号1到5落在5以内,返回WK-001;行号6到13落在13,返回WK-002。

不用造矩阵,不用循环,纯查找。


五、速度对决:2万行的时候谁扛得住?

我把规模放大来算:1000条计划,平均每条20个子件,展开就是2万行。

方法1的REDUCE,每压一次栈都要把累积数组整个复制一遍,2万行规模大约要搬5000万个格子——这是唯一带循环的写法,数据量翻倍,耗时翻4倍,大表上直接卡死。

方法2的TOCOL,全是向量化操作,速度快;但它要造一个1000行×最大次数的中间矩阵,开销跟着最大子件数走,中间混一个200子件的怪胎,矩阵就暴涨。

方法3的区间定位,只做一次升序二分匹配,开销只跟总行数走,最省内存。

图4:公式汇总表——A:I列5个方案的速度排名、公式长度、推荐指数和超链接

结论一句话:要速度,把重复翻译成区间,用查找去落座。


六、最终版本:我交付给客户的架构

单公式再快,也架不住MRP场景的一个现实:计划员改一行,全表重算。所以真正交付的版本,中间过程要落到辅助列上。

架构三段:

H列,组界辅助列:=SCAN(,F2:.F1000,SUM)——源表不动它就不算。

J列,主键列:用方法3的逻辑把主键展开,注意这一列身兼三职——它是辅助列,是输出的第1列,还是后面查找的键。

K到N列:=XLOOKUP(主键,源A列,取值列),按主键精确查找。重复的主键永远命中第一条,而重复行的内容本来就一模一样,所以怎么取都对。

这个架构的好处:源表乱序、中间插行,都不影响结果。以后接BOM展开,主键后面拼一个组内序号变成复合键,从MPS展开到毛需求计算,整条链不用换骨架。

图3:最终版本表——H列组界辅助列(5/13/19/26/33/41/49/51),J列主键列,K:N列按主键取数


七、扩容规则:给公式留生长空间

所有公式区域统一用语法糖预留到1000行(A2:.A1000),客户往后续录计划,输出自动跟着长,公式一个字不用改。

再往上的预留规则,我定了档位制:数据不超过1万预留1万,不超过10万预留10万,再往上按十万进位。看位数选档,不用算。

唯一的红线:源数据必须连续录入,中间不能留空行——空行会截断组界累积,这是所有区间定位法的共性约束,交付的时候要写进使用说明。


最后说一句

一行变多行这个动作,看着是体力活,其实是MRP计算的咽喉:展开层慢一秒,后面每一步重算都跟着慢。

把重复翻译成区间,把中间过程落到辅助列,把查找只算一次——这三句话,就是我这次实测沉淀下来的全部。

你的MPS还在复制粘贴吗?评论区聊聊。


术语解释

文章里出现的技术名词,一句话说清楚:

MPS(Master Production Schedule,主生产计划):工厂排产的第一张计划表,决定每个产品什么时候做、做多少。

BOM(Bill of Materials,物料清单):一个产品由哪些子件组成、各用多少的清单,工厂的户口本。

动态数组:一个公式自动往下溢出多行结果的写法,WPS表格的新能力,不用拖填充柄。

XLOOKUP:新版查找函数,支持模糊匹配模式,这里用来判断行号落在哪个区间。

组界:每条计划在展开结果里的截止行号,比如第1条占1到5行,组界就是5。

REDUCE:遍历数组的迭代函数,带着一个累积结果逐条处理,类似循环。

TOCOL:把一片区域拍平成一列的函数,第三参数设3可以顺手丢掉错误值。


古老师(古哥计划)|AI落地专家 · 制造业FDE实践者|中小制造数字化专家|金山 KVP(金山办公最有价值专家)|金山多维表格应用场景专家|金山 WPS 社区优秀创作者

深耕中小制造业数字化落地,擅长用 WPS 多维表格 + AI 低代码方案,帮工厂快速搭建进销存、生产计划、质量追溯等轻量化系统。不用复杂 IT,低成本落地,已服务数百家制造企业,实战经验丰富。

#多维表格 #工厂管理 #AI落地 #AI应用 #FDE

本文由 AI 辅助创作

工具:AI 灵犀专业版

模式:Pro 模式(智能判断模型)


古老师(古哥计划)|AI落地专家 · 制造业FDE实践者

买MRP系统前,先看看一张公式表能帮你省多少钱。关键词:古哥计划 | 古老师 | AI落地专家 | FDE | MRP需求计算 | WPS动态数组 | 生产计划展开 | 零代码MRP

广东省
浏览 541
1
7
分享
7 +1
2
1 +1
全部评论 2
 
CJ
学习学习 过来学习一下
   浙江省
举报
0
1
古哥计划
古哥计划Lv.4 核心创作者KVP

Lv.4 核心创作者

感谢您的支持!
· 广东省
举报
0
0