
使用SCAN與LAMBDA函數可創建任意窗口期的移動平均,無需輔助列。通過SCAN遍歷數據并用LAMBDA維護狀態,結合SEQUENCE與INDEX實現高效滑動窗口計算,最終封裝為可復用的MOVING_AVERAGE函數,支持動態數組實時更新。
在Excel中,使用SCAN與LAMBDA函數可以靈活創建自定義的移動平均函數,尤其適用于任意窗口期的動態計算。傳統方法如OFFSET或AVERAGE常受限于固定結構,而SCAN配合LAMBDA提供了更簡潔、可復用的解決方案。
理解SCAN與LAMBDA的基本作用
SCAN函數用于遍歷數組并累積中間結果,其語法為SCAN(初始值,數組,LAMBDA)。它會返回一個與原數組等長的結果數組,適合逐元素處理場景。
LAMBDA允許你定義自定義函數,無需VBA,直接在公式中封裝邏輯。結合兩者,可以在不使用輔助列的情況下實時計算移動平均。
構建任意窗口期的移動平均函數
核心思路是:利用SCAN記錄最近N個數據點,并在每個位置計算其平均值。雖然SCAN本身不能直接滑動窗口,但可通過LAMBDA維護一個“狀態”來模擬窗口行為。
例如,假設數據在A2:A100,想計算窗口期為3的移動平均:
具體公式如下:
=DROP(SCAN("",A2:A100,LAMBDA(acc,x,LET(current,IF(ISNUMBER(acc),HSTACK(acc,x),x),len,COLUMNS(current),window,IF(len>=3,INDEX(current,,SEQUENCE(,3,,-2)),current),AVERAGE(window)))),,-1)說明:此例僅示意邏輯,實際需更精確控制窗口長度。更優方式是用INDEX和ROW組合追蹤位置。
簡化并通用化為可復用的LAMBDA函數
將邏輯封裝成命名函數,比如叫MOVING_AVERAGE:
推薦實現方式:
=LAMBDA(data,n,BYROW(SEQUENCE(ROWS(data)),LAMBDA(i,IF(i這個版本雖未使用SCAN,但在多數情況下更穩定高效。若堅持用SCAN模擬過程流,可結合計數器與條件判斷,但復雜度更高,實用性略低。
基本上就這些。對于大多數用戶,BYROW+SEQUENCE方式更直觀可靠;SCAN+LAMBDA更適合需要狀態傳遞的復雜累積場景。掌握這兩種模式,就能應對各種動態計算需求。
以上就是ExcelSCAN與LAMBDA如何創建自定義移動平均函數_SCAN實現任意窗口期移動平均計算的詳細內容,!

