学习时间:2023-07-26
花费时间:两个半小时
参考资料:星光版主及网络搜索
学习函数:MAP
学习心得:365 函数,原以为没有用,后来发现经典的用法思路后,感觉非常香。
批量降价 需要对公司所有的产品统一降价100元,按常规的公式写法,就是=C1-100,下拉填充,这样就得到了正确的结果。如果需要转成MAP函数的写法,就是录入函数: =MAP(D2:D13,LAMBDA(X,X-100)) 根据函数的定义,先把D2:D13定义成X,再用LAMBDA的表达未来传递,让X-100,这样X区域中的每一个元素都会执行一次减去100,等同于=C1-100,下拉填充。 问题来了,为什么需要这样写,直接填充不好吗? 直接填充与一键填充,这就是两个公式的区别,而且当公式2可以跳过空行,如果D列存在空行的话,双击下拉填充,遇到空行自动中断,用MAP函数自动一键填充,优势就出来了。 重复次数统计 重复数是生产计划中经常需要统计的,而且还需要按出现次数累计统计,如下图所示,这样就可以实现连续编号,为后面的引用创建一个新的ID,进而实现一对多引用时候的“一对一”引用。 实现的方法也有很多,分别用四个方法来讲。 方法一:=COUNTIFS($A$2:A2,A2),这个是条件统计,因为锁定了第一个单元格,向下填充就可以得出,这个方法的优势就是简单好理解,缺点就是速度太慢了,如果20000行,直接就运算超过60秒。 方法二:=IF(A1<>A2,1,C1+1),这个方法是用IF判断,因为不是累计统计,速度非常快,最优推荐。传统公式,需要向下填充 方法三:=MAP(A2:A10,LAMBDA(X,COUNTIFS(A2:X,X))),这个是动态数组公式,不需要填充,是方法一的MAP写法,优势就是不用填充,速度比方法一快一点,但是还是运算慢,放在这里只是为了说明MAP函数中LAMBDA参数可以用“A2:X”这样的写法; 方法四:=SCAN(0,A2:A10,LAMBDA(X,Y,(Y=OFFSET(Y,-1,))*X+1)),这个运算速度非常快,而且是动态数组,因为不需要累计引用,所以数据量大的推荐此函数最佳; 累计求和 有时候需要统计各个月的累计产量,累计完成量的时候,可以用MAP,公式理解后,逻辑结构非常清晰;举例说明:订单5000,工序1的日产能为500,工序2的日产能为750,问工序1需要前置几天生产才能满足工序2的生产? 要解决这个问题,可以用Excel建立一个模型,按下图录入数据后,录入公式: =MAP(B2:B11,LAMBDA(X,SUM(B2:X))),工序1的累计产能 =MAP(D2:D11,LAMBDA(X,SUM(D2:X))),工序2的累计产能 =C2#-E2#,工序1减去工序1 上图中,可以看到,如果工序2连续生产的话,第3天工序1的库存最高,达到1500,实际排程中,有时候要在连续生产和切换生产中平衡,没有绝对的平衡,一般情况成本最优来建模,如果库存成本高的话,就切换生产。如下图中,第2天开始生产,第5天停产1天,到第6天生产。这样只切换了1次,库存下降了1000。 累计欠料 MC物控有时候需要针对物料的库存来预判累计欠料,此时可以用MAP函数来实现一键建模。如下图,零件A和B的库存分别为30和40,有8张生产任务需求,现计算出零件A和B的累计欠料。 =XLOOKUP(E2:E9,A2:A3,B2:B3),零件匹配库存数量 =G2#-MAP(E2:E9,LAMBDA(X,SUMIF(E2:X,X,F2:F9))),库存数量减去累计需求数量。得到累计欠料 =IF(H2#>0,0,IF(ABS(H2#)<F2:F9,H2#,-F2:F9)),IF判断得到工单欠料 ,上述三个函数为动态数组,一键填充。
|