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