全文约1500 字;
阅读时间:约4分钟;
听完时间:约8分钟;
昨天在文章中,我们完成了欠料计算的核心部分。下一步是要将这些计算结果整合进主生产计划中,以实现左侧展示计划、右侧显示欠料的效果。在汇总欠料的子件时,通过结合使用UNIQUE和FILTER函数,我们能有效地筛选并列出所有欠料的子件名称,同时确保每个子件名称仅出现一次。接下来,还需要汇总产生这些欠料的工单信息——这些工单可能是一个或多个,并且需要进一步展示每天的欠料情况以及对应子件的汇总欠料量。
欠料工单汇总欠料对应工单的整体逻辑是这样的,筛选出欠料小于0,同时条件等于汇总表子件的工单明细表,再通过REDUCE函数进行堆叠,这样就可以知道这个欠的料的子件对应的工单明细了,如子件A1,欠料对应的工单为WK-01、WK-02;
在合适位置录入以下动态数组公式:
=DROP(REDUCE("",M3#,LAMBDA(X,Y,VSTACK(X,ARRAYTOTEXT(UNIQUE(FILTER('4.分解'!AQ3#,('4.分解'!AZ3#<0)*('4.分解'!AS3#=Y))))))),1)
公式解释:
公式通过7层的逐一运算得到;
REDUCE函数:作用: 该函数用于对数据进行累积处理,可以用来构建一个列表或数组。
参数:
"": 初始值为空字符串。
M3#: 这里应该是当前表中的子件列,用于迭代处理。
LAMBDA(X, Y, ...): 定义了一个匿名函数(LAMBDA),该函数接收两个参数:X 和 Y。
X: 表示累积的结果。
Y: 表示当前迭代的值,即子件名称。
LAMBDA函数:作用: 定义了一个匿名函数,用于处理REDUCE函数中的每一步。
参数:
X: 当前累积的结果。
Y: 当前处理的子件名称。
VSTACK(X, ...): 将累积的结果与新计算的数据垂直堆叠起来。
VSTACK函数:作用: 垂直堆叠数组。
参数:
X: 当前累积的结果。
ARRAYTOTEXT(UNIQUE(FILTER(...))): 新计算的数据。
FILTER函数:作用: 从一个范围内筛选满足条件的行。
参数:
'4.分解'!AQ3#: “4.分解”表中的工单编号列。
('4.分解'!AZ3# < 0): 筛选欠料数量小于0的行。
('4.分解'!AS3# = Y): 筛选子件名称等于当前子件名称的行。
UNIQUE函数:作用: 返回唯一值。
参数:
FILTER(...): 由FILTER函数返回的结果。
ARRAYTOTEXT函数:作用: 将数组转换为文本。
参数:
UNIQUE(FILTER(...)): 由UNIQUE函数返回的结果。
DROP函数:作用: 从数组中删除指定数量的元素。
参数:
1: 删除第一个元素,因为初始值是空字符串。
综上所述,这个函数的作用是从“4.分解”表中筛选出欠料数量小于0并且子件名称与当前子件名称匹配的工单编号,然后将这些工单编号按照唯一的子件名称进行汇总,并去除第一个不必要的空字符串。
效果如下图所示:
每日欠料接下来的任务是汇总每日的欠料。为了做到这一点,我们首先需要在主生产计划表中引用日期。在P2单元格中输入公式=E2#来获取日期序列,例如:8月22日、8月23日等。
接着,在下方输入汇总欠料的公式:
=SUMIFS('4.分解'!AZ3#,'4.分解'!AS3#,M3#,'4.分解'!AU3#,P2#)
公式解释如下:
求和区域:'4.分解'!AZ3#,这是“4.分解”表中的欠料数量列。
条件区域1:'4.分解'!AS3#,这是“4.分解”表中的子件明细列。
条件1:M3#,这是当前表中的子件名称列。
条件区域2:'4.分解'!AU3#,这是“4.分解”表中的排程日期列。
条件2:P2#,这是当前表中的日期序列。
这个公式会根据子件名称和排程日期来汇总每日的欠料数量。
效果如下图所示:
汇总欠料有了每日的欠料后,就需求针对每一个子件进行按行汇总,此时可以用函数BYROW来快速汇总,在合适位置录入以下动态数组公式:
=BYROW(P3#,SUM)
这是BYROW函数按行求和汇总的解释,标准写法为:=BYROW(P3#,LAMBDA(X,SUM(X))),公式解释如下:
作用: 对指定范围内的每一行应用一个函数,并返回一个数组,其中每个元素是应用该函数后的结果。
参数:
P3#: 指定要进行按行汇总的范围,这里应该是包含欠料数据的区域。
LAMBDA(X, SUM(X)): 定义了一个匿名函数(LAMBDA),该函数接收一个参数X,代表当前行的数据,并对该行使用SUM函数求和。
这个公式将对P3#区域中的每一行应用SUM函数,从而实现按行汇总的功能。
最后总结通过一系列精心设计的Excel函数,我们实现了欠料工单与每日欠料的有效汇总。
欠料工单汇总:
使用了复杂的函数组合来筛选出欠料数量小于0且子件名称与当前子件名称匹配的工单编号,然后将这些工单编号按照唯一的子件名称进行汇总,并去除第一个不必要的空字符串。
每日欠料汇总:
在主生产计划表中通过公式=E2#获取日期序列。
使用SUMIFS函数根据子件名称和排程日期来汇总每日的欠料数量。
按行汇总欠料:
应用了BYROW函数对包含欠料数据的区域按行汇总,快速得到了每个子件的欠料汇总。
这一系列操作不仅提高了数据处理的效率,还确保了欠料信息的准确性,有助于供应链管理和生产计划的优化。
最终效果如下:
功能测试为了验证是否已经实现了全自动、动态扩展计算欠料的功能,我们通过更改主计划的排程日期与数量来测试欠料数据是否发生变化。
测试一
调整8月22日的生产计划为不生产,并将生产数量更改为在8月23日至8月25日这段时间内完成。
可以看到,当左侧的主生产计划数据更新后,右侧的欠料数据也随之同步更新。
测试二
增加一张新的工单WK-03,生产C产品,总数量为643个,其中8月22日生产300个,8月23日生产剩余的343个。
结果显示,系统能够自动扩展并正确反映新增工单的欠料情况。
到这里,PMC的《全自动每日欠料齐套》已经设计完成。PMC需要更新的输入表包括:
表1:二维主生产计划表
表2:用料分析表
表3:子件现存量
更新好这些输入数据后,此表将全自动地运算出对应的欠料分析。