一提起自定義函數(UDF),很多表哥表姐想到的Alt+F11打開VBE編輯器,寫一個Function.隨著EXCEL版本的更新,EXCEL也像其它程式語言一樣,推出了表達式函數LAMBDA,通過這個函數加名稱管理器,我們可以在編寫簡短的自定義函數時,不再需要使用VBE窗體。
關於這個函數,微軟的官方連結為https://insider.office.com/blog/lambda-excel-custom-functions
使用些功能,需要為EXCEL2019或Microsoft 365版本,並且加入了預覽體驗計劃。但相信隨著微軟的更新,預計2021年6月份,這個功能會向正式用戶開放。
要查看你的版本信息,點擊左上角的文件選項卡,點擊帳戶,就可以看到。
小灰灰當前用的版本為:
下面用一些例子來說明LAMBDA函數的用法。
簡單用法
假設要寫一個根據圓半徑求圓周長的公式,用數學表達就是f(x)=*3.14*x*x,此時們就來定義這個公式。
打開公式選項卡,點擊定義名稱,或按Ctrl+F3,打開名稱管理器,選擇新建
在名稱中輸入ymj,在引用位置中輸入 =Lambda(x,3.14*x^2),點擊確定按鈕。
我們測試一下,在B2單元格求一下半徑為5的圓面積,輸入=ymj(5),結果為78.5,完全正整。
有朋友會說,這個自定義函數我直接寫公式就可以了,何必這麼麻煩。如果真的這麼簡單,微軟也沒有必要推出這個功能了。在我看來,LAMBDA函數對比普通公式及VBA定義以公式,主要以以下優點:
LAMBDA函數可以實現函數的遞歸調用,也就是函數中調用自身;
LAMBDA函數保存於工作薄中,如果是VBA寫的自定義函數,如果宏安全性設定的較高,則無法運行;如果是加載宏中的自定義函數,換了另一臺電腦,可能就無法打開。
下面我們來看一下LAMBDA函數的神奇用法
求斐波那契數列(簡稱F數列)
在F數列中,存在以下通項公式:F(x)=F(x-1)+F(x-2)。我們可以利用這個性質直接來寫F數列的自定義函數。
新建名稱:fbnq,引用位置填寫:=LAMBDA(x,IF(x<=2,1,fbnq(x-1)+fbnq(x-2)))
測試一下,完全正確。
反轉字符串
反轉字符串為求一個字符串的逆序串,比如輸入good,返回為doog。VBA中有strReverse函數可以實現此功能,但是EXCEL工作表函數中不提供等價函數。
如果知道數組公式,我們可以寫公式 =CONCAT(MID(A1,99-ROW($1:$98),1))
現在我們用自定義函數的方式實現
新建名稱:strRev,引用位置填寫:=LAMBDA(x,IF(LEN(x)=1,x,RIGHT(x)&strRev(LEFT(x,LEN(x)-1))))
對照一下,完全正確。
按特定字符分割字符串
按特定字符分割字符串,在EXCEL中可以用分列的功能來實現,我們寫個函數來實現這個功能。
新建名稱:sp,引用位置填寫:=LAMBDA(x,y,LET(z,FIND(y,x),SWITCH(COLUMN(Sheet1!$A$1:$B$1),1,LEFT(x,z-1),2,MID(x,z+1,99))))
本函數核心在於用SWICT函數構購內存數組,同時使用LET函數,實現函數的簡寫效果。看下效果,以省分割省、市二級行政單位
輸入指定的年份,月份,生成日曆
這個相對比較高級一點的應用。新建名稱:rili,引用位置填寫:=LAMBDA(year,month,LET(x,ROW(Sheet4!$A$1:$G$8),y,COLUMN(Sheet4!$A$1:$G$8),a,DATE(year,month,1),b,DATE(year,month+1,0),c,FLOOR(a,7),d,c+(x-4)*7+y,SWITCH(x,1,MID("日一二三四五六",y,1),2," ",IF((d>=a)*(d<=b),DAY(d)," "))))
看下效果
注意第三例,第四例中需要用到動態數組的自動擴展,需要保證右側沒有單元格被使用,否則會報#SPILL!錯誤。