HI,大家好,我是星光。
今天給大家聊SCAN。
這貨的基本語(yǔ)法如下:
=SCAN(初始值,數(shù)據(jù)源,
LAMBDA(參數(shù)1,參數(shù)2,計(jì)算方式))
它可以遍歷數(shù)據(jù)源的每一個(gè)數(shù)據(jù),根據(jù)計(jì)算方式,返回一個(gè)與數(shù)據(jù)源尺寸相等的數(shù)組。
舉三個(gè)常見(jiàn)的用法小栗子。
1
填充空值
如下圖所示,A列存在合并單元格,現(xiàn)在需要?jiǎng)?chuàng)建一個(gè)內(nèi)存數(shù)組,將A列的數(shù)據(jù)填充完整
——既然你已經(jīng)學(xué)到SCAN,函數(shù)段位起碼也是星耀Ⅴ了,就別問(wèn)我這個(gè)問(wèn)題為什么用內(nèi)存數(shù)組,而不是基礎(chǔ)操作或者輔助列了
。SCAN函數(shù)解法參考如下:
公式看不全可以左右拖動(dòng)..
=SCAN('',A1:A12,
LAMBDA(_a,_b,IF(_b='',_a,_b)))
第1參數(shù)是初始值,第2參數(shù)是數(shù)據(jù)源A1:A12,第3參數(shù)是一個(gè)LAMBDA表達(dá)式,它又有3個(gè)參數(shù),前兩個(gè)參數(shù)分別被命名為_(kāi)a和_b,其中_a指向初始值,_b指向數(shù)據(jù)源的迭代元素,第3個(gè)參數(shù)是一條IF函數(shù)??
IF(_b='',_a,_b)
IF函數(shù)的意思是如果計(jì)算元素_b為空,則返回初始值_a,否則返回_b自身。
SCAN遍歷數(shù)據(jù)源的每個(gè)元素,并執(zhí)行LAMBDA計(jì)算,整個(gè)公式的計(jì)算過(guò)程如下▼
第1次先計(jì)算A1單元格的值,此時(shí)初始值_a為空,_b指向A1單元格,值為'姓名'。_b不等于空,IF表達(dá)式返回_b自身,SCAN將計(jì)算結(jié)果作為新的初始值。初始值_a也就變成了'姓名'。
第2次計(jì)算A2單元格的值,此時(shí)_b指向A2單元格,值為'看見(jiàn)星光',它不等于空,IF表達(dá)式返回_b自身,SCAN將計(jì)算結(jié)果作為新的初始值。初始值_a就變成了'看見(jiàn)星光'。
第3次計(jì)算A3單元格的值,此時(shí)_b指向A3單元格,值為空,它等于空,IF表達(dá)式返回初始值_a,SCAN將計(jì)算結(jié)果作為新的初始值。初始值_a依然是'看見(jiàn)星光'。
第4次計(jì)算A4單元格的值,此時(shí)_b指向A4單元格,值為空,IF表達(dá)式返回初始值_a,SCAN將計(jì)算結(jié)果作為新的初始值。初始值_a還是'看見(jiàn)星光'。
……
其余以此類(lèi)推,把每個(gè)元素遍歷完成后,將計(jì)算結(jié)果以數(shù)組的形式返回。
在各種親疏關(guān)系不同的場(chǎng)合里我們都講過(guò),工作表新函數(shù)正在加速向編程語(yǔ)言轉(zhuǎn)換,學(xué)習(xí)這類(lèi)新函數(shù),多少都需要一點(diǎn)編程的循環(huán)思維。如果你學(xué)過(guò)VBA又或者其它編程語(yǔ)言,再看這類(lèi)新函數(shù)應(yīng)該簡(jiǎn)單很多,畢竟它們只是一類(lèi)被封裝好的基礎(chǔ)循環(huán)語(yǔ)句。
SCAN函數(shù)不但支持引用,也支持?jǐn)?shù)組,不但支持查詢(xún),也支持聚合等計(jì)算方式。
2
累加求和
如下圖所示,需要將A列的數(shù)據(jù)按B列的指定次數(shù)重復(fù),D列為模擬結(jié)果。
這題函數(shù)解法有十幾種,其中涉及到SCAN函數(shù)的解法參考如下:
=XLOOKUP(
SEQUENCE(SUM(B2:B5)),
SCAN(0,B2:B5,
LAMBDA(_a,_b,_a+_b)),
A2:A5,
'',1,-1)
SCAN部分作為XLOOKUP函數(shù)的查詢(xún)范圍,對(duì)B列的數(shù)據(jù)累加求和。
SCAN(0,B2:B5,
LAMBDA(_a,_b,_a+_b))
第1參數(shù)是初始值,為0,第2參數(shù)是數(shù)據(jù)源B2:B5,第3參數(shù)是LAMBDA表達(dá)式。系統(tǒng)遍歷數(shù)據(jù)源的每一個(gè)數(shù)據(jù)▼
第1次時(shí),初始值_a為0,計(jì)算元素_b指向B2單元格,為2,計(jì)算結(jié)果是_a+_b,為2,作為新的初始值。
第2次時(shí),初始值_a為2,計(jì)算元素_b指向B3單元格,為3,計(jì)算結(jié)果是_a+_b,為5,作為新的初始值。
第3次時(shí),初始值_a為5,計(jì)算元素_b指向B4單元格,為4,計(jì)算結(jié)果是_a+_b,為9,作為新的初始值。
第4次時(shí),初始值_a為9,計(jì)算元素_b指向B5單元格,為2,計(jì)算結(jié)果是_a+_b,為11,作為新的初始值。
最后返回計(jì)算結(jié)果組成的內(nèi)存數(shù)組:
XLOOKUP函數(shù)查找SEQUENCE函數(shù)生成的序列值,查找范圍是SCAN函數(shù)返回的累加求和的數(shù)組,結(jié)果范圍是A2:A5,查詢(xún)方式是從后往前找,找下一個(gè)較大項(xiàng)。比如,當(dāng)尋找1時(shí),匹配大于等于1的最小值2,返回對(duì)應(yīng)的人名看見(jiàn)星光。
3
連勝次數(shù)
如下圖所示,是A列各支隊(duì)伍10輪比賽的情況,需要在L列統(tǒng)計(jì)每支隊(duì)伍最大的連勝次數(shù)。
SCAN函數(shù)解法參考如下:
L2單元格輸入后向下復(fù)制填充:
=MAX(SCAN(0,B2:K2,
LAMBDA(_a,_b,IF(_b='勝',_a+1,0))))
SCAN第1參數(shù)是初始值,為0,第2參數(shù)是數(shù)據(jù)源B2:K2,第3參數(shù)是LAMBDA表達(dá)式。遍歷數(shù)據(jù)源的每一個(gè)元素,如果為勝,則累加初始值,否則將初始值歸0。
SCAN函數(shù)返回一個(gè)內(nèi)存數(shù)組。例如,二肥隊(duì)B3:K3返回結(jié)果如下:
最后使用MAX函數(shù)從中取最大值,也就是相關(guān)隊(duì)伍的最大連勝次數(shù)。
相比于傳統(tǒng)的FREQUENCY函數(shù)而言,SCAN的計(jì)算過(guò)程是不是清晰很多?
最后給大家說(shuō)一個(gè)好消息,在新函數(shù)體系里,SCAN函數(shù)并不是必須的,大部分時(shí)候,它能做到的事情,REDUCE函數(shù)都能做到(效率和公式長(zhǎng)短有差異)。然后再給大家說(shuō)一個(gè)壞消息,號(hào)稱(chēng)萬(wàn)能函數(shù)的REDUCE相比SCAN函數(shù)而言,要更……難一些。
今天給大家分享的內(nèi)容就這樣, 揮揮手,咱們明天再見(jiàn)。
原載公眾號(hào):Excel星球
作者:看見(jiàn)星光
聯(lián)系客服