Excel 中的 LAMBDA 函數可以配合名稱管理員即可以建立自訂函數。
參考這篇文章:Excel-建立可以重複使用的自訂函數(LAMBDA,LET)
LAMBDA 函數也可以搭配特定函數使用而不用到名稱管理員,本篇要針對這些函數來做練習。例如:
REDUCE 函數
透過對每個值套用 LAMBDA 函數並在累計值中傳回總計值,將陣列縮減為累計值。
MAP 函數
透過套用 LAMBDA 函數建立新值,傳回將陣列中每個值對應到新值所形成的陣列。
SCAN 函數
透過對每個值套用 LAMBDA 函數掃描陣列,並傳回具有每個中繼值的陣列。
1. REDUCE 函數應用
語法:REDUCE([initial_value], array, lambda(accumulator, value))
[initial_value] 設定累計值的起始值
array:要縮減的陣列
lambda:呼叫用於縮減陣列的 LAMBDA。LAMBDA 接受兩個參數:
accumulator:值已加總且傳回為最終結果。
value:計算套用至陣列中每個元素。
運算一
公式:=REDUCE(0,G2:G6,LAMBDA(a,b,a+b))
a=0,b={1, 2, 3, 4, 5}
結果:=0+1+2+3+4+5=15
公式可以看成以「0」為起始值,再把儲存格G2:G6內容逐一加總。
運算二
公式:=REDUCE(1,G2:G6,LAMBDA(a,b,a+b^2))
a=1,b={1, 2, 3, 4, 5}
結果:=1+1^2+2^2+3^2+4^2+5^2=56
運算三
公式:=REDUCE(2,G2:G6,LAMBDA(a,b,a+b^2))
a=2,b={1, 2, 3, 4, 5}
結果:=2+1^2+2^2+3^2+4^2+5^2=57
運算一
公式:=REDUCE(0,{1,2,3,4,5},LAMBDA(a,b,a+b))
公式:=REDUCE(0,ROW(1:5),LAMBDA(a,b,a+b))
a=0,b={1, 2, 3, 4, 5}
結果:=0+1+2+3+4+5=15
運算二
公式:=REDUCE(1,{1,2,3,4,5},LAMBDA(a,b,a+b^2))
公式:=REDUCE(1,ROW(1:5),LAMBDA(a,b,a+b^2))
a=1,b={1, 2, 3, 4, 5}
結果:=1+1^2+2^2+3^2+4^2+5^2=56
2 MAP 函數應用
語法:MAP (array1, lambda_or_array<#>)
array1:要對應的陣列。
lambda_or_array<#>:LAMBDA 必須是最後一個引數,也必須為每個陣列傳遞一個參數,或是有要對應的另一個陣列。LAMBDA 接受兩個參數:
accumulator:值已加總且傳回為最終結果。
value:計算套用至陣列中每個元素。
以下的範例,可以將陣列內容X2。
(1) 儲存格A2:=MAP({1,2,3,4,5},LAMBDA(a,a*2))
(2) 儲存格A5:=MAP(H1:L1,LAMBDA(a,a*2))
(3) 儲存格A8:=MAP(COLUMN(A:E),LAMBDA(a,a*2))
公式會傳回動態陣列中每一個元素的結果:2、4、6、8、10。
(1) 儲存格A2:=MAP({1,2,3,4,5},{4,5,6,7,8},LAMBDA(a,b,a+b))
二個陣列對應相乘,得到:(1+4)=5、(2+5)=7、(3+6)=9、(4+7)=11、(5+8)=13
(2) 儲存格A6:=MAP({2,8,9},{1,7,6},{3,4,5},LAMBDA(a,b,c,MAX(a,b,c)))
三個陣列對應取最大,得到:MAX(2,1,3)=3、MAX(8,7,4)=8、MAX(9,6,5)=9
(3) 儲存格A10:=MAP(H9:L9,H10:L10,H11:L11,LAMBDA(a,b,c,(a+b)*c))
得到:(1+5)*6=36、(7+2)*2=18、(4+7)*3=33、(2+7)*3=27、(1+1)*3=6
(4) 儲存格A14:=MAP(H13:L13,LAMBDA(a,IF(ISEVEN(a),a,"")))
篩選偶數者,得到:空、2、空、6、6
3. SCAN 函數應用
語法:SCAN ([initial_value], array, lambda(accumulator, value))
[initial_value]:設定累計值的起始值。
array:要掃描的陣列。
lambda:呼叫用於掃描陣列的 LAMBDA。LAMBDA 接受兩個參數:
accumulator:值已加總且傳回為最終結果。
value:計算套用至陣列中每個元素。
(1) 儲存格A2:=SCAN(0,{1,2,3,4,5},LAMBDA(a,b,a+b))
得到:0+1=1、1+2=3、3+3=6、6+4=10、10+5=15
SCAN 函數傳回一個動態陣列結果。
比較:=REDUCE(0,{1,2,3,4,5},LAMBDA(a,b,a+b))=15
REDUCE只會傳回一組最後的結果
(2) 儲存格A5:=SCAN("X",H7:L7,LAMBDA(a,b,a&b))
得到:Xa、Xab、Xabc、Xabcd、Xabcde
(3) 儲存格A8:=SCAN({"Good"},{"你","我","他"},LAMBDA(a,b,a&b))
得到:Good你、Good你我、Good你我他
參考資源
LAMBDA 函數參考微軟提供的說明:LAMBDA 函數
REDUCE 函數參考微軟提供的說明:REDUCE 函數
MAP 函數參考微軟提供的說明:MAP 函數
SCAN 函數參考微軟提供的說明:SCAN 函數
留言列表