目錄
一、前言
二、官方介紹
三、低階玩法
3.1 應(yīng)用一:LAMBDA的公式應(yīng)用
3.2 應(yīng)用二:傳統(tǒng)公式創(chuàng)建九九乘法表
3.3 應(yīng)用二:LAMBDA創(chuàng)建九九乘法表
四、中階玩法
4.1 應(yīng)用三:拆分工資條
4.2 應(yīng)用四:批量替換
五、高階玩法
5.1 篩選不重復(fù)值
5.2 生成前x個(gè)數(shù)中的素?cái)?shù)
5.3 數(shù)學(xué)循環(huán)公式計(jì)算
六、后記
一、前言
REDUCE與LAMBDA都是Excel中的高階函數(shù),在Microsoft 365中得到支持。
LAMBDA函數(shù)的出現(xiàn)是劃時(shí)代的,他的出現(xiàn)標(biāo)志著EXCEL的學(xué)習(xí)方向從公式思維轉(zhuǎn)變?yōu)榫幊趟季S來解決數(shù)據(jù)問題,而REDUCE函數(shù)的迭代計(jì)算配合LAMBDA函數(shù)使得Excel無所不能。
知識源于經(jīng)驗(yàn),但絕不來源于經(jīng)驗(yàn)
——康德《純粹理性批判》
二、官方介紹
LAMBDA函數(shù)參見:
https://support.microsoft.com/zh-cn/office/lambda-%E5%87%BD%E6%95%B0-bd212d27-1cd1-4321-a34a-ccbf254b8b67
REDUCE函數(shù)參見:
https://support.microsoft.com/zh-cn/office/reduce-%E5%87%BD%E6%95%B0-42e39910-b345-45f3-84b8-0642b568b7cb
三、低階玩法
排除掉VBA和PowerQuery等玩法,使用Excel處理數(shù)據(jù)本身就是公式的排列組合嵌套,因此低階玩法就是兩個(gè)函數(shù)分開單獨(dú)使用。REDUCE函數(shù)需要搭配LAMBDA函數(shù)使用,所以低階玩法中僅對LAMBDA做介紹。
在任一單元格中輸入”=LAMBDA(x,y,x+y)(3,5)”,其結(jié)果為8,簡單解釋即定義”x”與”y”兩個(gè)參數(shù),然后創(chuàng)建一個(gè)”x+y”的函數(shù),最后對x和y分別賦值為”3”和”5”,最后返回結(jié)果”8”。
此時(shí)會(huì)有疑問:LAMBDA使用了看起來更加復(fù)雜的計(jì)算方法,得到的是和傳統(tǒng)公式一樣的結(jié)果,為什么要使用LAMBDA呢?在低階應(yīng)用時(shí),LAMBDA確實(shí)不如傳統(tǒng)公式簡潔明了,但當(dāng)一次性處理的數(shù)據(jù)多了的時(shí)候,請看應(yīng)用二:創(chuàng)建一個(gè)九九乘法表
傳統(tǒng)公式:輸入”
=IF(ROW()>=COLUMN(),COLUMN()&"×"&ROW()&"="&ROW()*COLUMN(),"")
”,然后分別右拉下拉9格即完成。
缺點(diǎn):修改顯示位置麻煩;這只是9×9的表格,如果是9000×9000呢?一格一格拉嗎?
LAMBDA用法:輸入”
=MAKEARRAY(9,9,LAMBDA(x,y,IF(x>=y,y&"×"&x&"="&x*y,"")))
”,直接回車完成。
公式解釋:“先使用MAKEARRAY()函數(shù)創(chuàng)建一個(gè)9×9的數(shù)列,接著使用LAMBDA函數(shù)構(gòu)造乘法公式,其中”x”和”y”的值分別為行和列,在MAKEARRAY中給出。
缺點(diǎn):需要理解函數(shù)。
此時(shí)LAMBDA函數(shù)對批量數(shù)據(jù)的處理能力已經(jīng)初見端倪。
四、中階玩法
中階就需要REDUCE與LAMBDA進(jìn)行嵌套使用了,可以簡單解釋為REDUCR(①,②,LAMBDA(x,y,⑤)),其中①是累加器的初始值,②是累加器的數(shù)組,REDUCE函數(shù)會(huì)在此數(shù)組上進(jìn)行累加。⑤是構(gòu)建的x關(guān)于y的函數(shù)。在嵌套使用中,y作為每一次循環(huán)中的自變量,在數(shù)組②中一步一步地前進(jìn),x作為每一次循環(huán)的結(jié)果,在y遍歷完數(shù)組②之后輸出。
最經(jīng)典的應(yīng)用莫過于對工資條的拆分了。
應(yīng)用三:拆分工資條
輸入”
=REDUCE("",A2:A10,LAMBDA(x,y,VSTACK(x,A1:E1,FILTER(A2:E10,A2:A10=y," "),IF(A1:E1>0," "))))
”
其中VSTACK函數(shù)在Office 365以后支持;FILTER函數(shù)在Excel 2019以后支持。
文字解釋:累加值x的初始值為空,使用y遍歷”A2:A10”數(shù)組得到每次循環(huán)的姓名,再使用FILTER函數(shù)根據(jù)姓名(每一次的y)篩選出對應(yīng)的手機(jī)號、工資等(FILTER(A2:E10,A2:A10=y," "),也可以使用OFFSET取出每一行數(shù)值),接著使用VSTACK函數(shù),把每一次循環(huán)中得到的數(shù)據(jù)都加上表頭并組合(VSTACK(x,A1:E1,FILTER(*),IF(A1:E1>0," "))),其中IF(A1:E1>0," ")是為了在每一段循環(huán)后面加上空白行(也可以直接寫””,在最后嵌套IFERROR/IFNA函數(shù)解決),最后使用DROP函數(shù)處理掉第一行。
應(yīng)用四:批量替換
在Excel中,我們通常使用REPLACE函數(shù)或SUBSTITUTE函數(shù)進(jìn)行文本替換,但在實(shí)際操作中往往需要多層嵌套。維護(hù)十分不便。
輸入”
=REDUCE(B2,$D$2:$D$11,LAMBDA(x,y,SUBSTITUTE(x,y,VLOOKUP(y,$D$2:$E$11,2,FALSE))))
”
使用高階函數(shù)組合后,可有效避免多層嵌套問題,哪怕是1萬個(gè)對應(yīng)關(guān)系,也可以輕松解決。
五、高階玩法
熟練掌握中階玩法后,高階玩法無非就是一些高階函數(shù)的嵌套使用和數(shù)學(xué)邏輯判定,如繼續(xù)嵌套LET函數(shù)對變量命名使得后續(xù)維護(hù)(不一定)更加方便,這里不再贅述,只是列出一些現(xiàn)成整合好的函數(shù)可供參考
篩選不重復(fù)值,把P:P換成需要篩選的列即可(↓完整復(fù)制)
=LET(SCOPE,P:P,START,MIN(IF(SCOPE<>"",ROW(SCOPE),""))+1,COL,COLUMN(SCOPE),DROP(REDUCE("",SEQUENCE(MAX((SCOPE<>"")*(ROW(SCOPE)))-1,,START,1),LAMBDA(X,Y,LET(PRE,INDIRECT("R"&Y&"C"&COL,FALSE),IF(COUNTIF(OFFSET(INDIRECT("R"&START&"C"&COL,FALSE),,,Y-1),PRE)=1,VSTACK(X,PRE),X)))),1))&T(N("只需要把P:P換成需要篩選的列,即可篩選出來不重復(fù)值(office365版本),如果第一個(gè)數(shù)據(jù)不在第二行請修改START "))
生成前x個(gè)數(shù)中的素?cái)?shù)(修改100為x,即可生成前x個(gè)數(shù)中的質(zhì)數(shù))=REDUCE(,SEQUENCE(100),LAMBDA(x,y,IF(COUNT(0/(MOD(y,SEQUENCE(y))=0))<3,VSTACK(x,y),x)))
數(shù)學(xué)中的循環(huán)計(jì)算,例如下式:
=LET(終止數(shù),100,REDUCE(0,SORT(REDUCE(,SEQUENCE(終止數(shù)),LAMBDA(x,y,IF(COUNT(0/(MOD(y,SEQUENCE(y))=0))<3,VSTACK(x,y),x))),1,-1),LAMBDA(x,y,POWER(y+x,1/y)))-1)
六、后記
限于水平,還有一些高階函數(shù)相互嵌套例子未列出,此文僅拋磚引玉為此函數(shù)的應(yīng)用作一些參考。
聯(lián)系客服