从上一楼的分析可以看出,根据BOM清单求成本就是要不断的去搜寻当前的子件是不是其他子件的母件,如果是的话要继续寻找,直到查找到最终原材料,然后逐层往上返回成本。这也是典型的递归模式,因此也可以使用LAMBDA函数定一个kx的名称通过递归来实现。我们可以先来分步骤看下上一楼的每个步骤大概是要如何来用公式实现。
1)筛选所有子件所在行。
我们以母件编码和编号这个数组为参数,假设筛选A3:B3单元格区域代表的母件对应的所有子件,可以用以下公式:
- =FILTER($C$10:$F$26,$A$10:$A$26&$B$10:$B$26=CONCAT(A3:B3))
复制代码 我们可以把母件编码和版本号连接在一起,然后用FILTER函数筛选出所有子件编码的行。每行包括4个元素,前两个为子件编码和版本号(可用于继续查询),后两个为母件和子件数量关系。
2)逐行处理第1步筛选出的所有行。
因为是逐行处理,并且每行只返回一个成本数值,因此可以用BYROW函数来解决。
- =BYROW(第1步筛选出来的数组,LAMBDA(y,INDEX(y,3)/INDEX(y,4)*IF(INDEX(y,2)=0,VLOOKUP(@y,$H$3:$I$12,2,),kx(TAKE(y,,2)))))
复制代码 其中INDEX(y,3)/INDEX(y,4)部分计算得到生产1个单位上层母件需要使用几个单位当前子件,这个数量要乘以当前子件的成本,而这个成本要用IF函数生成。
IF(INDEX(y,2)=0,VLOOKUP(@y,$H$3:$I$12,2,),kx(TAKE(y,,2)))部分判断,如果这一行数据的第2个值是0(也就是没有子件版本号),则用VLOOKUP函数获得当前子件的单价。如果这一行数据的第2个值不是0(也就是有子版本号),则要重复调用kx这个自定义函数,将当前行的前两个元素(TAKE函数获取前2列)作为参数继续查找。
3)BYROW函数处理完每一行后,会得到每一行子件的成本,这若干个成本需要用SUM函数加总起来,然后往上一级返回。
完整的kx公式如下:
- =LAMBDA(x,SUM(BYROW(FILTER($C$10:$F$26,$A$10:$A$26&$B$10:$B$26=CONCAT(x)),LAMBDA(y,INDEX(y,3)/INDEX(y,4)*IF(INDEX(y,2)=0,VLOOKUP(@y,$H$3:$I$12,2,),kx(TAKE(y,,2)))))))
复制代码
|