HI,大家好,我是星光。今天給大家聊SCAN。
這貨的基本語法如下:
=SCAN(初始值,數據源,
LAMBDA(參數1,參數2,計算方式))
它可以遍曆數據源的每一個數據,根據計算方式,返回一個與數據源尺寸相等的數組。
舉三個常見的用法小栗子。
1 填充空值
如下圖所示,A列存在合并單元格,現在需要創建一個内存數組,将A列的數據填充完整
——既然你已經學到SCAN,函數段位起碼也是星耀Ⅴ了,就别問我這個問題為什麼用内存數組,而不是基礎操作或者輔助列了。
SCAN函數解法參考如下:
公式看不全可以左右拖動..
=SCAN("",A1:A12,
LAMBDA(_a,_b,IF(_b="",_a,_b)))
第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也就變成了"姓名"。
第2次計算A2單元格的值,此時_b指向A2單元格,值為"看見星光",它不等于空,IF表達式返回_b自身,SCAN将計算結果作為新的初始值。初始值_a就變成了"看見星光"。
第3次計算A3單元格的值,此時_b指向A3單元格,值為空,它等于空,IF表達式返回初始值_a,SCAN将計算結果作為新的初始值。初始值_a依然是"看見星光"。
第4次計算A4單元格的值,此時_b指向A4單元格,值為空,IF表達式返回初始值_a,SCAN将計算結果作為新的初始值。初始值_a還是"看見星光"。
……
其餘以此類推,把每個元素遍曆完成後,将計算結果以數組的形式返回。
在各種親疏關系不同的場合裡我們都講過,工作表新函數正在加速向編程語言轉換,學習這類新函數,多少都需要一點編程的循環思維。如果你學過VBA又或者其它編程語言,再看這類新函數應該簡單很多,畢竟它們隻是一類被封裝好的基礎循環語句。
SCAN函數不但支持引用,也支持數組,不但支持查詢,也支持聚合等計算方式。
2 累加求和
如下圖所示,需要将A列的數據按B列的指定次數重複,D列為模拟結果。
(星光老師的原圖有公衆号二維碼,但是頭條号裡不允許,那就不好意思了……)
這題函數解法有十幾種,其中涉及到SCAN函數的解法參考如下:
=XLOOKUP(
SEQUENCE(SUM(B2:B5)),
SCAN(0,B2:B5,
LAMBDA(_a,_b,_a _b)),
A2:A5,
"",1,-1)
SCAN部分作為XLOOKUP函數的查詢範圍,對B列的數據累加求和。
SCAN(0,B2:B5,
LAMBDA(_a,_b,_a _b))
第1參數是初始值,為0,第2參數是數據源B2:B5,第3參數是LAMBDA表達式。系統遍曆數據源的每一個數據▼
第1次時,初始值_a為0,計算元素_b指向B2單元格,為2,計算結果是_a _b,為2,作為新的初始值。
第2次時,初始值_a為2,計算元素_b指向B3單元格,為3,計算結果是_a _b,為5,作為新的初始值。
第3次時,初始值_a為5,計算元素_b指向B4單元格,為4,計算結果是_a _b,為9,作為新的初始值。
第4次時,初始值_a為9,計算元素_b指向B5單元格,為2,計算結果是_a _b,為11,作為新的初始值。
最後返回計算結果組成的内存數組:
XLOOKUP函數查找SEQUENCE函數生成的序列值,查找範圍是SCAN函數返回的累加求和的數組,結果範圍是A2:A5,查詢方式是從後往前找,找下一個較大項。比如,當尋找1時,匹配大于等于1的最小值2,返回對應的人名看見星光。
3 連勝次數
如下圖所示,是A列各支隊伍10輪比賽的情況,需要在L列統計每支隊伍最大的連勝次數。
SCAN函數解法參考如下:
L2單元格輸入後向下複制填充:
=MAX(SCAN(0,B2:K2,
LAMBDA(_a,_b,IF(_b="勝",_a 1,0))))
SCAN第1參數是初始值,為0,第2參數是數據源B2:K2,第3參數是LAMBDA表達式。遍曆數據源的每一個元素,如果為勝,則累加初始值,否則将初始值歸0。
SCAN函數返回一個内存數組。例如,二肥隊B3:K3返回結果如下:
最後使用MAX函數從中取最大值,也就是相關隊伍的最大連勝次數。
相比于傳統的FREQUENCY函數而言,SCAN的計算過程是不是清晰很多?
最後給大家說一個好消息,在新函數體系裡,SCAN函數并不是必須的,大部分時候,它能做到的事情,REDUCE函數都能做到(效率和公式長短有差異)。然後再給大家說一個壞消息,号稱萬能函數的REDUCE相比SCAN函數而言,要更……難一些。
今天給大家分享的内容就這樣, 揮揮手,咱們明天再見。
原載公衆号:Excel星球
作者:看見星光
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!