LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數


LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
HI,大家好,我是星光 。今天給大家聊SCAN 。
這貨的基本語法如下:
=SCAN(初始值,數據源,LAMBDA(參數1,參數2,計算方式))
它可以遍歷數據源的每一個數據,根據計算方式,返回一個與數據源尺寸相等的數組 。
舉三個常見的用法小栗子 。
1 填充空值
如下圖所示,A列存在合并單元格,現在需要創建一個內存數組,將A列的數據填充完整
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
——既然你已經學到SCAN,函數段位起碼也是星耀Ⅴ了,就別問我這個問題為什么用內存數組,而不是基礎操作或者輔助列了 。
SCAN函數解法參考如下:
公式看不全可以左右拖動..
=SCAN("",A1:A12,LAMBDA(_a,_b,IF(_b="",_a,_b)))
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
第1參數是初始值,第2參數是數據源A1:A12,第3參數是一個LAMBDA表達式 , 它又有3個參數,前兩個參數分別被命名為_a和_b,其中_a指向初始值,_b指向數據源的迭代元素 , 第3個參數是一條IF函數
IF(_b="",_a,_b)
IF函數的意思是如果計算元素_b為空,則返回初始值_a,否則返回_b自身 。
SCAN遍歷數據源的每個元素,并執行LAMBDA計算,整個公式的計算過程如下▼
第1次先計算A1單元格的值 , 此時初始值_a為空,_b指向A1單元格,值為"姓名" 。_b不等于空,IF表達式返回_b自身 , SCAN將計算結果作為新的初始值 。初始值_a也就變成了"姓名" 。
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
第2次計算A2單元格的值,此時_b指向A2單元格,值為"看見星光",它不等于空,IF表達式返回_b自身 , SCAN將計算結果作為新的初始值 。初始值_a就變成了"看見星光" 。
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
第3次計算A3單元格的值,此時_b指向A3單元格,值為空,它等于空,IF表達式返回初始值_a , SCAN將計算結果作為新的初始值 。初始值_a依然是"看見星光" 。
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
第4次計算A4單元格的值 , 此時_b指向A4單元格,值為空,IF表達式返回初始值_a,SCAN將計算結果作為新的初始值 。初始值_a還是"看見星光" 。
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
……
其余以此類推,把每個元素遍歷完成后,將計算結果以數組的形式返回 。
在各種親疏關系不同的場合里我們都講過,工作表新函數正在加速向編程語言轉換,學習這類新函數,多少都需要一點編程的循環思維 。如果你學過VBA又或者其它編程語言,再看這類新函數應該簡單很多 , 畢竟它們只是一類被封裝好的基礎循環語句 。
SCAN函數不但支持引用,也支持數組,不但支持查詢 , 也支持聚合等計算方式 。
2 累加求和
如下圖所示,需要將A列的數據按B列的指定次數重復,D列為模擬結果 。
(星光老師的原圖有公眾號二維碼 , 但是頭條號里不允許,那就不好意思了……)
LAMBDA函數賢內助SCAN函數會用了嗎 如何使用lambda函數

文章插圖
這題函數解法有十幾種 , 其中涉及到SCAN函數的解法參考如下:
=XLOOKUP(
SEQUENCE(SUM(B2:B5)), SCAN(0,B2:B5,LAMBDA(_a,_b,_a _b)), A2:A5, "",1,-1)

相關經驗推薦