有了BYROW函数还要啥难度爆表的MMULT?

职场   2024-09-29 13:08   福建  
HI,大家好,我是星光。


上期给大家分享了MMULT函数,这个函数曾经是Excel中最难学但又比较重要的函数之一,很多函数高手都曾以征服它为目标。只所以难学,在于它的矩阵运算涉及到了线性代数;只所以重要,是它可以变相的将一个多行多列的数据矩阵,聚合为单列或单行的结构


👆点击图片阅读MMULT函数教程


但这一切都是曾经,再爱也都曲终人散了。现在有新的函数可以代替MMULT的特性,可以用更丰富的计算方式,更便捷的将矩阵聚合为单行或单列的结构——这就是BYROW/BYCOL函数。




基础语法


如下图所示,是一张成绩表,需要查询总分大于400的学员明细。



参考函数如下:


函数看不全可以左右拖动..

=FILTER(   A2:G6,  BYROW(B2:G6,LAMBDA(_row,SUM(_row)))>400)

BYROW函数有两个参数,第1个参数是需要遍历的数据,可以是引用也可以是数组,当是引用时会保留引用的特性——这句话暂时看不明白没关系,后面会有个相关的小案例。


BYROW函数的第2参数是一个LAMBDA表达式,它默认第1参数是一个变量,指向BYROW函数1参的每行数据;第2参数表示计算方式。

以上述公式来说,BYROW函数逐行遍历B2:G6单元格区域,通过LAMBDA函数执行计算。LAMBDA函数的第1参数将每行数据设置为变量_row,然后使用SUM函数将每行的数据求和,最后返回一个垂直内存数组👇(下图H列)


最后再判断该内存数组的值是否大于400,作为FILTER函数的筛选条件。

另外,LAMBDA表达式支持语法糖,以上公式可以简写为以下形式:

=FILTER(A2:G6,BYROW(B2:G6,SUM)>400)


聚合数值

再举一个简单的案例。


如上图所示,是学员几次考试的成绩,需要按每个学员的最高分求所有学员的总分。

参考函数如下:

函数看不全可以左右拖动..
=SUM( BYROW(B2:E6,   LAMBDA(_row,MAX(_row)) ) )

BYROW函数逐行遍历B2:E6区域,LAMBDA函数对每行数据执行MAX函数,得出每行最大值,最后使用SUM函数求和。


照例LAMBDA表达式可以使用语法糖:

=SUM(BYROW(B2:E6,MAX))

打个响指,问题扩展一下,按每个学员最好的两次成绩求和。

参考函数如下:

函数看不全可以左右拖动..
=SUM( BYROW(B2:E6,   LAMBDA(_row,SUM(LARGE(_row,{1,2})))  ) )
BYROW函数逐行遍历B2:E6区域,LAMBDA函数对每行数据执行计算,计算方式是先求出每行前2个最大值,最后SUM函数汇总求和。



聚合文本


相比于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,""))     ) ))
第2行至第8行是BYROW函数,逐行遍历B2:D6区域,第2参数LAMBDA执行计算方式。


LAMBDA第1参数是变量_row,指向B2:D6区域的每行数据。第2参数是一个LET函数。LET函数先运行以下函数公式,将每行成绩大于85的值和科目名称合并为一个字符串,将其赋值给变量_s。


_s,TEXTJOIN(",",1,IF(_row>85,B1:D1&"-"&_row,""))
LET函数最后判断_s是否为空字符串,如果非空,则在_s前添加姓名前缀👇


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)
BYROW函数解法如下:


=FILTER(    B2:B6,  BYROW(A2:A6,    LAMBDA(_row,COUNT(SEARCH({"围棋","二班","帅"},_row)))   )=3 )
使用BYROW遍历A2:A6的每行数据,执行LAMBDA函数计算。LAMBDA用SEARCH函数判断每个关键字在每行中是否存在,如果存在,则COUNT统计个数。


由于A2:A6是一个多行单列结构,这里也可以使用MAP函数代替BYROW函数。


=FILTER(  B2:B6,  MAP(A2:A6,      LAMBDA(_row,COUNT(SEARCH({"围棋","二班","帅"},_row)))  )=3)
于MAP函数,我们下期再聊


除了MAP函数之外,还有一个BYCOL函数,它是BYROW函数的孪生姐妹。BYROW函数是逐行遍历,BYCOL函数则是逐列遍历。它的语法与BYROW函数不能说100%一样,只能说99%一样就基本一样——当你需要把数据源中的每列数据分别聚合计算时,可以使用它。


摊手,今天给大家分享的内容就这样吧,有啥问题照例可以在VIP会员群中提问交流↓👇↓ 挥挥手,咱们明天再见。


案例文件下载度娘她妹的度盘..

https://pan.baidu.com/s/1ALFsuBcGe9hVxAW9x-o_jQ?pwd=mcws


>需要系统学习Excel,却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?

加入我的付费社群,学习+训练+答疑,与5000+在线会员一起,同微软最有价值专家MVP同行,全面精进表格之道

🚂>>~
加入我的付费会员,全面学习Excel
透视表 函数 图表 VBA PQ想学啥学啥
👀


本文由公众号“Excel星球”首发。

点击阅读原文系统学习Excel!

Excel星球
微软全球最有价值专家(Excel MVP),上千篇原创图文和视频教程随学随用,随用随查,建议常用Excel的职场人关注。
 最新文章