SCAN 函數

SCANMicrosoft 365 Excel 提供的 動態陣列累積計算函數,它會從 初始值開始,逐步對陣列中的每個元素執行 LAMBDA 運算,並回傳整個計算過程的數組

這對於 累積計算、逐步變化的數列、動態追蹤數據變化 特別有用,適合與 LAMBDA、REDUCE、MAP、BYROW、BYCOL 等函數組合使用!


? SCAN 函數語法

SCAN(initial_value, array, lambda(accumulator, value))
  • initial_value:初始值,計算從這個值開始累積。
  • array:要逐步處理的陣列。
  • lambda(accumulator, value)
    • accumulator:累積值,存儲當前計算結果並傳遞到下一次運算。
    • value:目前處理的陣列元素。

? 作用:遍歷 array,將每個 value 傳入 lambda,並將累積計算結果存入 accumulator,最終回傳 整個計算過程的陣列


? SCAN 函數應用範例

1️⃣ 計算陣列的累積總和

=SCAN(0, A1:A5, LAMBDA(acc, x, acc + x))

? 效果:依序累加 A1:A5,回傳 逐步變化的總和數列
? 類似 SUM,但會顯示整個累積過程!

範例:A1:A5 = {3, 5, 2, 7, 4}

結果 = {3, 8, 10, 17, 21}

第 1 項:3(0+3)
第 2 項:8(3+5)
第 3 項:10(8+2)
第 4 項:17(10+7)
第 5 項:21(17+4)


2️⃣ 計算陣列的累積乘積

=SCAN(1, A1:A5, LAMBDA(acc, x, acc * x))

? 效果:對 A1:A5 逐步累乘,回傳 累積乘積的數列

範例:A1:A5 = {2, 3, 4, 5}

結果 = {2, 6, 24, 120}

第 1 項:2(1×2)
第 2 項:6(2×3)
第 3 項:24(6×4)
第 4 項:120(24×5)


3️⃣ 追蹤每個值與前一個值的變化(差值)

=SCAN(0, A1:A5, LAMBDA(acc, x, x - acc))

? 效果:計算每個值與前一個值的變化量。

範例:A1:A5 = {10, 15, 20, 30}

結果 = {10, 5, 5, 10}

第 1 項:10(10-0)
第 2 項:5(15-10)
第 3 項:5(20-15)
第 4 項:10(30-20)


4️⃣ 累積字串拼接

=SCAN("", A1:A5, LAMBDA(acc, x, acc & x & " "))

? 效果:將 A1:A5 內容逐步 串接成字串數組

範例:A1:A5 = {“A”, “B”, “C”, “D”}

結果 = {"A", "A B", "A B C", "A B C D"}

第 1 項:”A”
第 2 項:”A B”
第 3 項:”A B C”
第 4 項:”A B C D”


5️⃣ 計算動態折扣後的價格

=SCAN(100, A1:A5, LAMBDA(acc, x, acc * (1 - x)))

? 效果:以 100 為起始值,對 A1:A5 每個折扣值逐步計算折後價格。

範例:A1:A5 = {10%, 20%, 30%}

結果 = {90, 72, 50.4}

第 1 項:90(100 × 0.9)
第 2 項:72(90 × 0.8)
第 3 項:50.4(72 × 0.7)


? SCAN vs REDUCE

函數作用適用場景
SCAN逐步累積計算,回傳完整變化過程適合追蹤計算過程(陣列輸出)
REDUCE累積單一結果(總和、最大值)適合總結計算(單一輸出)

? 如果你只要最終結果,使用 REDUCE,如果你想保留整個累積過程,使用 SCAN


? 總結

SCAN 讓 Excel 公式更靈活,可用於累加、乘積、累積變化等應用
適合處理動態陣列,並可搭配 LAMBDA 進行自訂計算
可與 REDUCE、MAP、BYROW、BYCOL 結合,實現更進階的數據處理!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *