255 WPS新函数案例:复杂的产品欠料运算

古哥计划
古哥计划

优秀创作者

2023年最后一天,接到一个工厂生产计划的需求,他们工厂的欠料非常难以计算,因为工厂规模比较小,没有上信息化,所以的物料需求及欠料都是人工运算,今天找到古哥咨询如何快速计算产品的欠料。

需求:表1是需要装配的一些产品,有装配顺序,现在需要根据这些装配的品的零件(表2物料清单)以及零件对应的库存(表3)计算出实际可装配的数量,如果不能装配的话,装配的零件缺口的名称是哪些?装配零件缺口的数量又是多少?

因为总成中的零件有很多是使用相同零件的,实际装配数量中需要考虑按顺序配置对应的零件装配数量体现。比方说装配顺序1号使用的零件500件,但是到装配2号后可能实际零件不足够使用400件的零件,只能够装配300件,缺口100件的装配零件。能够体现到缺口名称和对应缺口数量中。

所以需求通俗点就是告诉生产计划,哪些可以生产,哪些不可以生产,不可以生的欠什么东西?欠多少?

图1

表2是这些装配产品的物料清单,看到这样的物料清单(BOM),也是非常痛苦,这也是中小工厂的一些特点,基础表单不规范,后续做数据分析整理的时候难点重重。

图2

表3是零件的库存,这个零件的库存还算正常,是一个标准的一维数据表。

图3

整理BOM表

表2是零件的物料清单,也就是BOM表,如果希望表1生产计划表和表2的物料清单进行联动,以现在的BOM表是无法联动的,所以需要对现有的BOM表进行整理。整理成一个标准的一维表。

插入辅助列,命名为总成名称,录入函数:

B3=IF(C3="","",IF(C2="零件名称",D2,B2)),下拉填充

函数释义:

这一步的目的是让总成名称放在BOM表的左边,以形成与表1的联动,带出订单需求。

如果单元格C3 为空,则返回空值("")。

如果单元格C2 的值等于 "零件名称",则返回 D2:38281040190。

如果单元格C2 的值不等于 "零件名称",则返回 B2:"总成名称"。

这样根据相对引用的原理,下拉填充就把总成名称一键填充到零件的右边了。

根据这个总成,把表1的排程顺序引用过来,录入函数:

=IF(B3="","",XLOOKUP(B3,计划下达!B:B,计划下达!A:A,0))

再通过零件把库存引用过来:

=IF(B3="","",XLOOKUP(D3,库存数量!C:C,库存数量!D:D,0))

这样BOM表就整理好了

最终效果下图4所示:

图4

整理数据

在运算欠料明需要把表2中总成名称对应的零件物料清单的数据进行二次整理,也就是两个约束:

约束1:零件代码一样的放在一起

约束2:相同零件代码中,按排程顺序升序排序,也就是上面需求所说,优先扣减排序在前的总成。

根据这两个约束录入函数:

=SORT(SORT(FILTER(B3:F5000,(B3:B5000<>"")*(D3:D5000<>"-")),5),3)

函数释义:

筛选B列不为空和D列不等于符号“-”的数据,显示的结果是B到F列,再根据这个结果进行排序,第一次排序为第5列,排序方式升序,也就是排程顺序,第二次排序为第3列,也就是零件,排序方式也是升序。两次排序后就相当于上面的两个约束。效果如下图5所示:

图5

上面这个公式是一个大的动态数据,为了方便后续二次写函数,配合CHOOSECOLS来分成一个个单列的动态数组,依次把参数从1录入到5,5个公式:

=CHOOSECOLS(SORT(SORT(FILTER(B3:F5000,(B3:B5000<>"")*(D3:D5000<>"-")),5),3),1)

=CHOOSECOLS(SORT(SORT(FILTER(B3:F5000,(B3:B5000<>"")*(D3:D5000<>"-")),5),3),2)

…………

判断欠料

判断欠料的大逻辑就是库存减去需求,减去需求的同时考虑扣减顺序,如库存400,第一个需求是700,运算后是-300,第二个需求是300,累计欠料就是-600,单个需求就是-300。分别录入以下函数:

订单需求:

=XLOOKUP(I3#,计划下达!B4:B12,计划下达!C4:C12),需要装配计划的总成数量。

累计需求:

=SUMIFS($M$3:M3,$K$3:K3,K3),这个是零件对应的累计需求,如果有通用件的话:A和B订单共用C零件, C对应A的需求是200,B的需求是300,累计需求就是500。

累计欠料:

=IF(L3-N3>0,0,L3-N3),用库存送去累计需求,大于0,显示为0;

单张欠料:

=IF(ABS(O3)<L3,O3,-M3),按每个独立需求来判断欠料,而不是累计;

实际可装配:

=IF(COUNTIFS($P$3:$P$60,"<0",$H$3#,H3)>0,0,M3),一个总成必须没有欠料,也就是没为负数的欠料,才能装配,如果没有欠料,返回M3,M3就是总成需求。最终完成的效果如下图6所示:

图6

引用欠料

表1是生产计划排程的主表,这张表上可以把上面根据物料清单计算出的欠料信息信息过来。

实际能够装配数量

=XLOOKUP(B4:B12,零件装配表!I:I,零件装配表!Q:Q)

装配零件缺口名称:

=TEXTJOIN(",",,FILTER(零件装配表!$K$3#,(零件装配表!$I$3#=B4)*(零件装配表!$P$3:$P$60<0)))

装配零件缺口数量:

=TEXTJOIN(",",,FILTER(零件装配表!$P$3:$P$60,(零件装配表!$I$3#=B4)*(零件装配表!$P$3:$P$60<0)))

完成后如下图7所示:

图7

知识点

到了上面这步已经把表1的排程零件对应的欠料信息一一计算出来了,本次的需求核心知识点:

知识点1:筛选IF的相对引用方式,把不规则的数据转换成标准的一维数据;

知识点2:用筛选函数把实际数据包含空行和特殊符号的数据去空。

知识点3:用排序函数把同类型的数据排序一起了

知识点4:利用累计库存减去累计需求来判断是否欠料

知识点5:利用统计函数统计负数来判断物料是否齐套,从而判断可以生产的总成数据;

知识点6:利用筛选函数加合并函数把欠料零件名称和数量引用到表1

我是古哥:

从事制造行本业20年,在企业运营、供应链管理、智能制造系统等方面具有丰富的实战经验。企业智能化,柔性化计划运营管理专家,擅长通过企业流程优化规范,企业管理、导入计划运营提升企业效率;对提高企业准时交货率,降低企业库存,输出智能制造人才有丰富的经验。学习PMC生产计划,关注古哥计划!

254 WPS新函数案例:灵活多变的万年日历

253 WPS新函数案例:指定工号快速筛选

252 WPS新函数案例:员工姓名与工号快速分离

251 WPS新函数案例:对客户快速分列并统计

250 WPS新函数案例:快速分类统计员工生日数

249 WPS新函数案例:多条件统计订单数

248 WPS新函数案例:快速统计记件人员工资

浙江省
浏览 511
收藏
3
分享
3 +1
2
+1
全部评论 2
 
亂雲飛渡
学习了
· 广东省
回复
古哥计划
古哥计划

优秀创作者

感谢您的支持,您的支持是我坚持创作的动力。
· 浙江省
1
回复