SCAN 是 Microsoft 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 結合,實現更進階的數據處理!