MC物控计划需要对损耗有足够的敏感度,如果对损耗没有搞清楚,很有可能就会导致生产欠料。针对损耗的一些知识点,古老师设计出一个面试物控员的题目,这个题目如果能够做出来,基本上就掌握了损耗的知识点。
下图中需要生产零件A 100个。已知零件A需要经过第1道到第5道工序才能完成加工,要求求出每道工序需要投料多少?才能保证100个A零件全部合格入库。

错误的结果
实际中确实有一些物控员想都没有想,就直接填写出以下图的答案,直根据每一道工序的损耗率来计算,录入公式:=$C$3*(1+E6),下拉填充,得到第1道需要投料103,第二道需要投料105……,一直到最后1道工序需要投料106。
对于这样的答案,可以说明此MC物控员基本的工艺知识都不了解,生产工序顺序的概念都没有。题目中已经明确了每一道工序,也标明了工艺顺序,证明是串行加工。如果按此来加工的话,肯定得不到100个合格的零件A。

正确认的结果
实际加工工序是串行加工的,所以每一道工序都需要为下一道工序的,所以需要用数学的方式来求解。所以有些时候古老师面试PMC的时候会问他们学生时代的数学成绩。
每道工序都会有一定的损耗,所以我们需要考虑这个因素。
所以我们假设从第一道工序开始,第1道工序的损耗率是X1,第2道是X2,以此类推,如果是5道工序的话,按串行加工的话就可以计算出总损耗率。
(1-X1)*(1-X2)*(1-X3)*(1-X4)*(1-X5)
=(1-0.03)*(1-0.05)*(1-0.06)*(1-0.03)*(0.94)= 0.789810278,总的合格率是:78.98%
所以,从第一道工序开始,需要投料 127 个原材料才能完成100个合格品。
Excel公式的写法
上面已经把原理搞清楚,对应的Excel应该如何设置呢?
直接录入就可以了:
G6 =C3/((1-E6)*(1-E7)*(1-E8)*(1-E9)*(1-E10))
H6 =G6*E6
I6 =G6-H6
G7= I6
H7 =G7*E7
I7=G7-H7
然后选中G7:I7,下拉填充即可。效果如下图,根据箭头指向可以清楚的看到最后一道工序的合格数量就是100 个;

Excel动态数组的写法
上面已经把的公式计算一个零件就需要写多个公式,非常麻烦,此时可以用高版本的Excel转成动态数组一键生成。
F6录入公式:
=LET(A,DROP(REDUCE("",D6:D100,LAMBDA(x,y,VSTACK(x,$D$3/PRODUCT(y:OFFSET($D$5,COUNT(D6:D100),))*HSTACK(1,1-y,y)))),1),FILTER(A,CHOOSECOLS(A,3)>0))
函数解释:
本公式使用了Excel 365的新函数,如 LET, DROP, REDUCE, LAMBDA, VSTACK, FILTER, 和 CHOOSECOLS。低版本打开会错误;
首先,LET 函数允许你为一个或多个表达式定义名称,并在整个公式中使用这些名称。A 是 DROP 和 REDUCE 函数的组合结果。
REDUCE 函数会将一个累加器和一个数组中的每个元素组合起来,使用一个给定的函数。在这里,累加器是 ""(空字符串),数组是 D6:D100。这里预留的范围,后续还有超过5个工序的可以自动展开;
LAMBDA 函数定义了一个匿名函数,该函数接受三个参数:x、y 和一个由 VSTACK 创建的数组。VSTACK 垂直堆叠了几个数组。第一个是累加器 x,第二个是 $D$3 除以从 y 到 OFFSET($D$5,COUNT(D6:D100),) 的元素的乘积,然后水平堆叠了 1、1-y 和 y。DROP 函数会移除结果数组的第一行。
最后,FILTER 函数会过滤数组 A,只返回第三列大于 0 的行。
