HI,大家好,我是星光。
今天一起聊聊Office 365中的新函數BYROW。
這個函數的作用是:將一個多行多列的數據矩陣,聚合為單列或單行的結構。
舉幾個小栗子。
▎基礎語法
如下圖所示,是一張成績表。現在需要查詢總分大于400的學員數據。
參考函數如下:
函數看不全可以左右拖動..
=FILTER(A2:G6,
BYROW(B2:G6,LAMBDA(_a,SUM(_a)))
>400
)
BYROW函數有兩個參數,第1個參數是需要逐行遍歷的數據,可以是引用也可以是數組,當是引用時會保留引用的特性——這句話暫時看不明白沒關系,后面會有個相關的小案例。
BYROW函數的第2參數是一個LAMBDA函數,該函數默認第1參數是一個變量,指向BYROW函數第1參數的每行數據;第2參數表示計算方式。
以上述公式來說,BYROW函數逐行遍歷B2:G6單元格區域,通過LAMBDA函數執行計算。LAMBDA函數的第1參數將每行數據設置為變量_a,然后使用SUM函數將每行的數據求和,返回一個垂直內存數組??
最后判斷該內存數組的值是否大于400,作為FILTER函數的篩選條件。
▎聚合數值
再舉一個簡單的案例。
如上圖所示,是學員幾次考試的成績,需要按每個學員的最高分求和。
參考函數如下:
函數看不全可以左右拖動..
=SUM(
BYROW(B2:E6,
LAMBDA(_a,MAX(_a))
)
)
BYROW函數逐行遍歷B2:E6區域,LAMBDA函數對每行數據執行MAX函數,得出每行最大值,最后使用SUM函數求和。
問題擴展一下,按每個學員最好的兩次成績求和。
參考函數如下:
函數看不全可以左右拖動..
=SUM(
BYROW(B2:E6,
LAMBDA(_a,SUM(LARGE(_a,{1,2})))
)
)
BYROW函數逐行遍歷B2:E6區域,LAMBDA函數對每行數據執行計算,計算方式是先求出每行前2個最大值,之后SUM函數匯總求和。
▎聚合文本
BYROW函數不但支持數值聚合,也支持文本聚合。
如上圖所示,A1:D6是數據源,需要從中篩選出各科成績大于85分的姓名及明細,并形成一句話總結報告。B8單元格是模擬結果。
參考函數如下:
函數看不全可以左右拖動..
=TEXTJOIN(CHAR(10),1,
BYROW(B2:D6,
LAMBDA(_n,
LET(
_s,TEXTJOIN(',',1,IF(_n>85,B1:D1&'-'&_n,'')),
IF(LEN(_s),INDEX(A:A,ROW(_n))&':'&_s,''))
)
)
)
第2行至第8行是BYROW函數,逐行遍歷B2:D6區域,第2參數LAMBDA執行計算方式。
LAMBDA第1參數是變量_n,指向B2:D6區域的每行數據。第2參數是一個LET函數。LET函數先運行以下函數公式,將每行成績大于85的值和科目名稱合并為一個字符串,將其賦值給變量_s。
_s,TEXTJOIN(',',1,IF(_n>85,B1:D1&'-'&_n,''))
LET函數最后判斷_s是否為空字符串,如果非空,則在_s前添加姓名前綴??
IF(LEN(_s),INDEX(A:A,ROW(_n))&':'&_s,'')
需要注意的是,在上面這條IF函數公式中,使用ROW(_n)返回每行的行號,再使用INDEX函數通過行號獲取姓名。這就是我們前面說的,當BYROW函數的第1參數是單元格引用時,它會保留引用的特性,由此我們才可以通過ROW函數獲取引用的行號。
最后使用TEXTJOIN函數將BYROW函數返回的垂直數組合并為一個字符串。
圖文制作:看見星光