上期给大家分享了MMULT函数,这个函数曾经是Excel中最难学但又比较重要的函数之一,很多函数高手都曾以征服它为目标。只所以难学,在于它的矩阵运算涉及到了线性代数;只所以重要,是它可以变相的将一个多行多列的数据矩阵,聚合为单列或单行的结构。
👆点击图片阅读MMULT函数教程
但这一切都是曾经,再爱也都曲终人散了。现在有新的函数可以代替MMULT的特性,可以用更丰富的计算方式,更便捷的将矩阵聚合为单行或单列的结构——这就是BYROW/BYCOL函数。
▎基础语法
如下图所示,是一张成绩表,需要查询总分大于400的学员明细。
参考函数如下:
函数看不全可以左右拖动..
=FILTER(
A2:G6,
BYROW(B2:G6,LAMBDA(_row,SUM(_row)))>400
)
BYROW函数有两个参数,第1个参数是需要逐行遍历的数据,可以是引用也可以是数组,当是引用时会保留引用的特性——这句话暂时看不明白没关系,后面会有个相关的小案例。
=FILTER(A2:G6,BYROW(B2:G6,SUM)>400)
=SUM(
BYROW(B2:E6,
LAMBDA(_row,MAX(_row))
)
)
BYROW函数逐行遍历B2:E6区域,LAMBDA函数对每行数据执行MAX函数,得出每行最大值,最后使用SUM函数求和。
=SUM(BYROW(B2:E6,MAX))
=SUM(
BYROW(B2:E6,
LAMBDA(_row,SUM(LARGE(_row,{1,2})))
)
)
▎聚合文本
相比于MMULT函数,BYROW函数更优秀的地方在于,它的聚合方式更加丰富,不但支持聚合数值,也支持聚合文本等。
如上图所示,A1:D6是数据源,需要从中筛选出各科成绩大于85分的姓名及明细,并形成一句话总结报告。B8单元格是模拟结果。
参考函数如下:
函数看不全可以左右拖动..
=TEXTJOIN(CHAR(10),1,
BYROW(B2:D6,
LAMBDA(_row,
LET(
_s,TEXTJOIN(",",1,IF(_row>85,B1:D1&"-"&_row,"")),
IF(LEN(_s),INDEX(A:A,ROW(_row))&":"&_s,""))
)
)
)
LAMBDA第1参数是变量_row,指向B2:D6区域的每行数据。第2参数是一个LET函数。LET函数先运行以下函数公式,将每行成绩大于85的值和科目名称合并为一个字符串,将其赋值给变量_s。
_s,TEXTJOIN(",",1,IF(_row>85,B1:D1&"-"&_row,""))
IF(LEN(_s),INDEX(A:A,ROW(_row))&":"&_s,"")
需要注意的是,在上面这条IF函数公式中,使用ROW(_row)返回每行的行号,再使用INDEX函数通过行号获取姓名。这就是我们前面说的,当BYROW函数的第1参数是单元格引用时,它会保留引用的特性,由此我们才可以通过ROW函数获取引用的行号。
最后使用TEXTJOIN函数将BYROW函数返回的垂直数组合并为一个字符串。
▎多关键字查询
最后再举一个我们在MMULT函数教程中使用过的例子。
如上图所示,A:B是数据源。现在,需要查询A列信息中同时包含发呆、围棋和帅三个关键字的人名。
MMULT函数解法如下:
函数看不全可以左右拖动..
=FILTER(
B1:B6,
MMULT(
ISNUMBER(SEARCH({"围棋","二班","帅"},A1:A6))+0,
{1;1;1}
)=3
)
=FILTER(
B2:B6,
BYROW(A2:A6,
LAMBDA(_row,COUNT(SEARCH({"围棋","二班","帅"},_row)))
)=3
)
由于A2:A6是一个多行单列结构,这里也可以使用MAP函数代替BYROW函数。
=FILTER(
B2:B6,
MAP(A2:A6,
LAMBDA(_row,COUNT(SEARCH({"围棋","二班","帅"},_row)))
)=3
)
除了MAP函数之外,还有一个BYCOL函数,它是BYROW函数的孪生姐妹。BYROW函数是逐行遍历,BYCOL函数则是逐列遍历。它的语法与BYROW函数不能说100%一样,只能说99%一样就基本一样——当你需要把数据源中的每列数据分别聚合计算时,可以使用它。
摊手,今天给大家分享的内容就这样吧,有啥问题照例可以在VIP会员群中提问交流↓👇↓ 挥挥手,咱们明天再见。
案例文件下载度娘她妹的度盘..
https://pan.baidu.com/s/1ALFsuBcGe9hVxAW9x-o_jQ?pwd=mcws
本文由公众号“Excel星球”首发。
点击阅读原文系统学习Excel!