接下來介紹 LAMBDA
函式的第四個輔助函式,SCAN
!
「scan」在這邊可以翻成「掃描」,而 SCAN
的作用在於對範圍中的每個值進行「掃描」、累計運算,會回傳一個範圍,裡面的數字是每個計算步驟的中繼值;而它最常見的用法就是算「移動總計」(running total)。
什麼是移動總計?舉個例子:
我想讓 A 欄每列的值跟它上一列的相加,並把這個結果顯示在 B 欄,像是這樣:
這就是 SCAN
可以派上用場的地方!
比起手動一個個算、或是「=A2 + A3
」、「=A3 + A4
」這樣的算式,SCAN
的做法更好管理、寫法也比較優雅一點,上面的例子只要短短一行:
=SCAN(0, A2:A11, LAMBDA(int, val, int + val))
接下來的教學會介紹幾項你能很快上手的 SCAN
應用。
歡迎來這邊複製一份試算表,跟我一起做做看!
=SCAN(初始值, 範圍, LAMBDA)
LAMBDA
計算前的初始值。SCAN
套用於範圍內每個值的自訂函式。這邊我習慣用 int
(initial,初始值的縮寫)和 val
(value,值的縮寫)來當作等等寫 LAMBDA
時要用上的代號:
=SCAN(初始值, 範圍, LAMBDA(int, val, ...))
接下來實際用 SCAN
來算些東西吧。
有部日本漫畫叫「烏龍派出所」,其中一個叫做「兩津勘吉」的主角,為了在短時間內存到錢,發明了一個叫做「倍倍儲蓄法」的存錢術。規則是先從很小的數目開始存錢(比如 10 塊),隔天存前一天的兩倍,不斷往下存,這麼一來就可以很快累積財富了。
用表格呈現的話:
雖然這個理財方法在現實世界中感覺很有難度,不過我們還是試試看在 C 欄計算「當天存到的成果是多少」吧。我的意思是:
第 1 天存到 10 塊
第 2 天存到 10 塊 + 20 塊 = 30 塊
第 3 天存到 10 塊 + 20 塊 + 40 塊 = 70 塊
第 4 天存到 10 塊 + 20 塊 + 40 塊 + 80 塊 = 150 塊
...
這個就可以用 SCAN
來計算!先彙整一下需求:
B2
到 B21
。LAMBDA
逐列計算。組裝起來,我們就會得到:
=SCAN(0, B2:B21, LAMBDA(int, val, int + val))
放在 C2
上面,看看結果:
SCAN
直接回傳了一組範圍,顯示了第 1 天到第 20 天存錢的各日總計分別是多少。這樣就算完囉!
SCAN
遇到中間有空白的範圍也可以算,只要搭配 IF
就能輕鬆達成。
我們來看看這張表:
我想計算移動總和,但要以年份分開、希望 SCAN
不要一路往下計算。
先來彙整一下需求:
B2
到 B15
。LAMBDA
逐列計算。要讓 SCAN
不要往下算,我們要在 LAMBDA
裡面放個 IF
讓 SCAN
在判斷的時候,遇到空值就不繼續累加、如果有數字就繼續累加:
=SCAN(0, B2:B15, LAMBDA(int, val, IF(val = "", val, int + val)))
我們在 C2
執行看看:
這樣就成功了!
最後用 SCAN
來算算看「達成率」。現在我有這張表,假設是某間公司每月的銷售額:
B 欄有每月的銷售額,F2
則是今年年初設下的年度目標。我想在 C 欄計算當月份的目標達成率是多少,可以幫助我們了解當月的達成率距離目標還有多遠。
達成率的算法是:
=累計銷售額 / 年度目標
舉例來說,一月當月的銷售額約 800 萬,達成率就是:
=7906659 / 100000000
二月當月的銷售額已經累計到約 1500 萬,是一月和二月的總和,達成率就是:
=(7906659 + 7004159) / 100000000
三月的達成率就是一月、二月和三月的總和,達成率就是:
=(7906659 + 7004159 + 2014572) / 100000000
以此類推。
一樣先來彙整需求:
B2
到 B13
。LAMBDA
逐列計算後,除以年度目標所在的 F2
。好囉!我把這些需求寫成 SCAN
的算式,寫在 C2
上:
=SCAN(0, B2:B13, LAMBDA(int, val, int + val / F2))
來看看結果:
這邊的達成率就算好囉!
另外,你還可以搭配剛介紹的 BYROW
跟 SPARKLINE
函式,簡單製作每月的進度條:
=BYROW(C2:C, LAMBDA(val, SPARKLINE(val, {"charttype", "bar"; "max", 1})))
在 D2
上執行:
這樣就可以輕易追蹤進度了。
如果不確定怎麼操作 BYROW
和 SPARKLINE
,可以來這看看:
以上就是 SCAN
的分享!
相較於其他輔助函式,坦白說我覺得 SCAN
的應用場景比較受限,大部分都是用在計算這類的移動總和,頂多有些在分組跟計算累計百分比上的變化。如果你有想到任何可以用 SCAN
函式的其他可能性,歡迎你留言分享給我知道,我會再研究研究!✨
如果你喜歡這次的文章,歡迎你透過這些方法支持我:
想要看更多文章的話,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!
我是喜特先生,Mr. Sheet,我們下個教學見!