太牛啦!Excel循环计算神器,MAP+MAP组合效率翻倍!
太牛啦!Excel循环计算神器,MAP+MAP组合效率翻倍!
场景一:
A列中有一组递增的数,在B列中通过函数计算,A列中的数第n次大于20*n。也就是第一次大于20返回1,第二次大于20*2返回2,第三次大于20*3返回3,依此类推。其余的都返回0。
思路:
在C列通过公式“=A2:A14/20”计算可以发现,要求第n次大于20*n,即C列结果为1的下一位返回1、结果为2的下一位返回2、结果为3的下一位返回3。
于是考虑采用向上取整数,如果取到的整数大于上一位整数,则为满足条件的数据,结果取原始数据/20再取整数位就可以了。
公式:
=MAP(A2:A14,LAMBDA(X,IF(X<=20,0,IF(ROUNDUP(X/20,0)>ROUNDUP(OFFSET(X,-1,0)/20,0),INT(X/20),0))))
解析:
MAP(A2:A14,LAMBDA(X,...))表示将数组A2:A14中的每个值依次传递到LAMBDA函数中作为X执行计算。
ROUNDUP(X/20,0)表示对“X/20”向上取整数;
ROUNDUP(OFFSET(X,-1,0)/20,0)表示对X的前一个计算后的值向上取整数;
IF(X<=20,0,...))表示如果X小于20,直接返回0,否则进入一步计算;
IF(ROUNDUP(X/20,0)>ROUNDUP(OFFSET(X,-1,0)/20,0),INT(X/20),0)判断原数据除以20的商向上取整数,如果大于上一位取到的整数,则返回INT(X/20),即当前数据除以20的整数位,否则返回0。
场景二:
混合文本数字中提取数字计算加权平均数。
权重表如下图所示:
思路:
先从混合文本中提取出数字,再逐个乘以各自的权重系数,最后就会得到加权平均数。
公式一:
=MAP(A1:A9,LAMBDA(a,LET(b,REGEXP(a,"[\d.-]+"),SUM(MAP(F22:L22,SEQUENCE(,7),LAMBDA(x,y,x*INDEX(b,,y)))))))
解析:
MAP(A1:A9,LAMBDA(X,...))表示将数组A1:A9中的每个值依次传递到LAMBDA函数中作为X执行计算。
LET(b,REGEXP(a,"[\d.-]+")将REGEXP提取出的数字定义为b,
SUM(MAP(F22:L22,SEQUENCE(,7),LAMBDA(x,y,x*INDEX(b,,y))))这部分为计算表达式。
其中,计算表达式中再次用到了MAP函数,x*INDEX(b,,y)表达MAP传递权重系数与提取到的数据相乘,最后SUM进行求和。
总的来说,就是第一个MAP依次传递混合文本执行计算,提取出数字;第二个MAP传递权重系数和提取出的数字进行计算后SUM求和。
使用MAP+MAP组合求解的目的在于研究MAP函数的嵌套用法,
比如:
=MAP(A1:A9,LAMBDA(a,LET(b,REGEXP(a,"[\d.-]+"),TEXTJOIN("/",,MAP(F22:L22,SEQUENCE(,7),LAMBDA(x,y,x&"*"&INDEX(b,,y)&"="&x*INDEX(b,,y)))))))
还可以返回计算过程公式:
本例中公式也可简化为公式二:
=MAP(A1:A9,LAMBDA(x,SUM(REGEXP(x,"[\d.-]+")*F22:L22)))
解析:
REGEXP(x,"[\d.-]+")*F22:L22为数组写法,表示提取到的一行7个数字整体与权重行数据相乘;
SUM(...)表示对计算得到的结果求和。
同样,MAP(A1:A9,LAMBDA(x,...))表示将数组A1:A9中的每个值依次传递到LAMBDA函数中作为x执行计算;
总体来说,就是每传递一个混合文本,提取出数字后与权重系数相乘再求和得到加权平均数。