487·LAMBDA帮助FILTER突破数组限制

标签:
lambdafilter遍历 |
分类: 公式技巧 |
原题A列是一组包含某些“关键字”的字符串
E:F列出了某些“履历”可能出现的“关键字”。
判断A列数据,是否包含三种“履历”。
如果仅判断A列数据是否包含“军人履历”,
只需要在B2单元格录入公式
=OR(COUNTIF($A2,FILTER("*"&$F$2:$F$30&"*",$E$2:$E$30=B$1)))
FILTER("*"&$F$2:$F$30&"*",$E$2:$E$30=B$1)部分表示:
只要E列等于“军人履历”,则返回F列,
只是在F列前后多加了星号,以作为下一步COUNTIF的通配符条件。
COUNTIF部分,判断A列数据是否含有刚才的通配符条件。
如果在A列找到了相对应的关键字,就会有个数字,否则就是0
最后外面套个OR函数,把得到的一串数字合起来,
只要出现一个非零数字,结果就是TRUE。
熟悉数组公式的朋友,一定会想到B1,C1,D1的条件,可以组成一个数组。
比如我们想知道,A列是否有三个履历都出现的数据。
FILTER的部分,是否可以写成
FILTER("*"&$F$2:$F$30&"*",$E$2:$E$30=B$1:D$1)
可是你会发现,FILTER不支持数组条件,十分可惜。
那我们就只能让$E$2:$E$30=B$1一次,计算OR(),得到一个逻辑值。
再让$E$2:$E$30=C$1,计算OR(),再得到一个逻辑值,
又让$E$2:$E$30=D$1,计算OR(),又得到一个逻辑值,
三个逻辑值加起来,如果是3,那就是全履历了。
这样实在太麻烦,现在是三个条件,如果再多几个岂不要一直加下去?
还好,出现了LAMBDA函数。
它不是能够制造一个累积求和的“篮子”吗?
把条件B$1的放进“篮子”里,
再依次把C$1的,D$1的也放进“篮子”里,
如果有更多,就继续放下去,直到一个条件出现。
这里,用LET函数定义了两个【名称】,
第一个【名称】是“履历”,它的值就是OR那部分,
只不过D$1,换成了OFFSET($D$1,,y)
这样就可以通过数值加减,改变单元格位置了。
这里的Y,是LAMBDA定义的“变量”,此例它需要从0,变到-1,再变到-2。
LET定义的第二个【名称】是“全履历”,它的值就是LAMBDA“递归”的那部分了。
如果Y=-2,全履历(-2)就和履历(-2)
如果Y=0,现在Y就是等于0
全履历(0)=履历(0)+全履历(-1)
而全履历(-1)=履历(-1)+全履历(-2)
全履历(-2)刚刚说了=履历(-2)
所以,全履历(0)最终=履历(0)+履历(-1)+履历(-2)
这就用一个公式遍历了三个单元格。