加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2024-04-13 11:19:35)
标签:

lambda

filter

遍历

分类: 公式技巧

原题A列是一组包含某些“关键字”的字符串

E:F列出了某些“履历”可能出现的“关键字”。

判断A列数据,是否包含三种“履历”。

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

如果仅判断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列,

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

只是在F列前后多加了星号,以作为下一步COUNTIF的通配符条件。

COUNTIF部分,判断A列数据是否含有刚才的通配符条件。

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

如果在A列找到了相对应的关键字,就会有个数字,否则就是0

最后外面套个OR函数,把得到的一串数字合起来,

只要出现一个非零数字,结果就是TRUE。

熟悉数组公式的朋友,一定会想到B1,C1,D1的条件,可以组成一个数组。

比如我们想知道,A列是否有三个履历都出现的数据。

FILTER的部分,是否可以写成

FILTER("*"&$F$2:$F$30&"*",$E$2:$E$30=B$1:D$1)

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

可是你会发现,FILTER不支持数组条件,十分可惜。

那我们就只能让$E$2:$E$30=B$1一次,计算OR(),得到一个逻辑值。

再让$E$2:$E$30=C$1,计算OR(),再得到一个逻辑值,

又让$E$2:$E$30=D$1,计算OR(),又得到一个逻辑值,

三个逻辑值加起来,如果是3,那就是全履历了。

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

这样实在太麻烦,现在是三个条件,如果再多几个岂不要一直加下去?

还好,出现了LAMBDA函数。

它不是能够制造一个累积求和的“篮子”吗?

把条件B$1的放进“篮子”里,

再依次把C$1的,D$1的也放进“篮子”里,

如果有更多,就继续放下去,直到一个条件出现。

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

这里,用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)

这就用一个公式遍历了三个单元格。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有