大数跨境
0
0

Byrow/Bycol函数:按行/列进行遍历的新函数

Byrow/Bycol函数:按行/列进行遍历的新函数 Excel Plus---不止是Excel
2025-10-31
6
Scan函数和Reduce函数是以单元格的单位在数组区间内进行遍历(如先扫描单元格A1,再扫描单元格A2...),但有时候,我们其实需要的是按照或者为单位进行运算,也即是扫描完一行/列,接着再扫描数组区间下一行/列,这个时候就可以使用Byrow/Bycol函数了,以下是它们的基本语法。
同scan/reduce函数一样,它支持lambda函数,所以可以使用的情景是很多的,以下就是碰到的几个实例。
案例1:嵌套if{1,0},创建一个数组

=IF({1,0},BYROW($A$3:$D$6,LAMBDA(x,CONCAT(x))),E3:E6)

以行为单位,将同行内各个数据通过CONCAT连接在一起,再嵌套if{1,0},创建一个数组,后面就可以再嵌套VLOOKUP等。

案例2:以行为单位进行非空值运算,即统计每一行有多少个非空值

=HSTACK(A2:A4,BYROW(B2:K4,COUNTA))

案例3:隔列相乘,再汇总

=SUM(BYROW(CHOOSECOLS(A1:E5,SEQUENCE(3,1,1,2)),PRODUCT))

先用CHOOSECOLS函数结合SEQUENCE函数提取数据区域中的第1,3,5列,然后嵌套BYROW函数进行PRODUCT聚合运算,最后汇总。

案例4:以行为单位进行分类汇总

=BYCOL(FILTER($B$1:$K$7,$A$1:$A$7=A12),LAMBDA(x,SUM(x)))

先根据A列的关键词在源数据中用FILTER函数进行筛选,然后嵌套BYCOL函数以列为单位进行SUM聚合运算。当然分类汇总是GROUPBY函数的强项,这里只是展示BYCOL函数的使用。

=GROUPBY(A1:A7,B1:K7,SUM,3,0)

案例5:以列为单位进行汇总,然后进行行/列转置

=TRANSPOSE(VSTACK(A1:E1,BYCOL(A2:E6,SUM)))

案例6:每天(上午,中午,加班)有任何时间在工作,该天就有餐补,计算餐补天数

=SUM(BYCOL(B3:F5,LAMBDA(x,IF(SUM(x)>0,1,0))))

每天(上午,中午,加班)有任何时间在工作,则说明该天总的工作时间是大于0,也即是该列的总数大于0,所以运算就是IF(SUM(x)>0,1,0),再将大于0的天数汇总起来即是餐补的天数。
案例7:为什么会出错?
本案例的目的是将每行的非重复值提取出来,然后各行之间纵向连接。间接的方法就是使用unique函数,然后把公式往下拖。所以想起可以使用BYROW函数,每行作UNIQUE运算,所以就有了下面的公式

=BYROW(A1:J3,LAMBDA(x,UNIQUE(x,1)))

然而结果显示错误,初步分析,本案例当中,第1行的结果为4列,第2行为3列,第3行为3列,因为数组的大小不匹配,所以会出错,那如果第1行,2行,3行返回的结果都是3列,总应该没有问题了吧?

于是,修改了数据源,这样确保每行的非重复值都是3个,结果仍然显示错误。但使用下面的公式倒是正确的,不过不是想要的格式,每行的结果都挤在一个单元格里面:

=BYROW(A1:J3, LAMBDA(row, TEXTJOIN(",", TRUE, UNIQUE(row,1))))

因此,我的判断是,BYROW函数按行处理之后,每行的运算结果只能存在于一个单元格当中,不可以是多列的结果,这个判断也在DEEPSEEK上得到了验证:


【声明】内容源于网络
0
0
Excel Plus---不止是Excel
分享20年外企供应链工作经验中关于EXCEL函数,公式,数组, VBA编程, PYTHON编程, POWER BI, POWER AUTOMATE, R语言编程等方面的实操以及技巧。
内容 44
粉丝 0
Excel Plus---不止是Excel 分享20年外企供应链工作经验中关于EXCEL函数,公式,数组, VBA编程, PYTHON编程, POWER BI, POWER AUTOMATE, R语言编程等方面的实操以及技巧。
总阅读50
粉丝0
内容44