Excel 中的 Lambda 函數:完整指南和實用範例

最後更新: 5月16 2026
  • LAMBDA 函數可讓您僅使用公式在 Excel 中建立自訂函數,而無需程式設計或 VBA。
  • BYROW、BYCOL、MAP、SCAN、REDUCE 和 MAKEARRAY 等相關函數應用 LAMBDA 來遍歷和變換矩陣。
  • 先在儲存格中測試 LAMBDA,然後將其儲存到名稱管理器中,可以簡化偵錯和重複使用過程。
  • LAMBDA 和新的動態矩陣函數簡化了高階計算,並取代了許多先前用巨集解決的過程。

Excel 中的 LAMBDA 函數

Excel 中的Lambda 函數徹底改變了我們在 Microsoft 電子表格中使用公式的方式。它允許您僅使用 Excel 的公式語言建立自訂函數,而無需編寫任何 VBA 程式碼或傳統程式語言。這就像您可以為程式添加全新的、自訂設計的原生函數一樣。

此外,圍繞 LAMBDA 函數還衍生出許多相關函數,例如BYROW、BYCOL、MAP、SCAN、REDUCE 和 MAKEARRAY,旨在以更靈活強大的方式處理區域和矩陣。這些函數大致類似於小型循環,它們遍歷資料並應用 LAMBDA 定義的轉換,從而為直接在電子表格上進行高級分析開闢了廣闊的可能性。

Excel 中的 LAMBDA 函數是什麼?它有什麼用途?

Lambda函數是一個工具,它允許您只使用 Excel 公式定義自訂函數。無需編寫 VBA 程式或依賴宏,您就可以將任何複雜的計算封裝到一個可重複使用的函數中,該函數具有自己的參數,並能產生清晰明確的最終結果。

實際上, LAMBDA 函數可以將任何公式轉換為可重複使用的函數。它的主要優勢在於能夠與 Excel 計算引擎的其他部分無縫集成,並且可以與標準函數、引用、自訂名稱和動態數組結合使用。

直接在單元格中使用時的基本語法是:

=LAMBDA(參數1; 參數2; …; 參數N; 計算結果)(值1; 值2; …; 值N)

在這個結構中,parameter1、parameter2、…、parameterN是你為函數內部的變數指定的名稱,而calculation則是使用這些參數產生結果的公式。最後,在第二組括號內,你傳遞函數執行時這些參數會要取的實際值。

如果您使用Excel 的名稱管理器建立永久的 LAMBDA 函數,語法會略有不同,因為您在那裡定義了函數,但尚未呼叫它。在這種情況下,格式如下:

=LAMBDA(var1; var2; …; varN; 計算)

之後,您可以使用在名稱管理員中給該函數指定的名稱來呼叫它,只需像使用 SUM、AVERAGE 或任何其他標準函數一樣輸入名稱和參數即可。

建立和測試 Lambda 函數的最佳實踐

當你開始使用 Lambda 函數時,遵循一些指導原則至關重要,這樣才能確保它們按預期運行,避免浪費時間調試複雜的錯誤。最實用的入門方法之一是直接在儲存格中建立和測試 Lambda 函數。

通常的做法是先寫出完整的公式,將 LAMBDA 函數的定義和呼叫放在同一個表達式中,這樣就可以立即查看結果是否符合預期。透過這種方式,可以在將其儲存為命名函數之前檢測出語法或邏輯錯誤。

例如,一個非常典型的測試結構如下:

=LAMBDA(); 計算)(測試值)

要檢查像給一個數字加 1 這樣非常簡單的操作,你可以使用:

=LAMBDA(number; number + 1)(1)

在這種情況下,函數將傳回值2。這是一個非常簡單的例子,但它可以說明其機制:首先定義參數和計算,然後呼叫該函數並傳遞相應的參數。

避免出現#CALC!錯誤的關鍵建議是確保 LAMBDA 函數始終傳回結果。這可以透過在公式末尾清晰地添加一個表達式來實現,該表達式會根據您的需求產生單一值或陣列。如果在測試過程中看到 #CALC! 錯誤,請檢查公式是否確實產生了 Excel 可以顯示的結果。

在儲存格中測試 LAMBDA 函數並確認其運作正常後,就可以將該邏輯移至名稱管理器,並將其轉換為可在整個工作表或工作簿中重複使用的自訂函數。

LAMBDA 與新矩陣函數的關係

圍繞著 LAMBDA,出現了一系列高級函數,如BYROW、BYCOL、MAP、SCAN、REDUCE 和 MAKEARRAY(後者在某些版本中被翻譯為 ARCHIVOMAKEARRAY),這些函數依賴 LAMBDA 對範圍和完整矩陣應用變換。

  Gemini Canvas是什麼?它的使用步驟是什麼?

其基本想法是,這些函數會遍歷資料範圍(按行、按列或逐個元素),並對每個元素或元素組執行您定義的 Lambda 函數。換句話說,它們的工作方式類似於循環,但整合在 Excel 的公式語言中。

這樣,您就可以直接使用單一陣列公式執行先前需要輔助列、中間表甚至巨集才能執行的操作,該公式可以一次展開並傳回整個範圍的結果。

在與 LAMBDA 相關的函數中,REDUCE、MAP、SCAN、BYCOL、BYROW 和 MAKEARRAY特別突出,每個函數都有其特定的目標:遍歷行、按列應用變換、累加結果、從頭開始建立計算的矩陣等等。它們的共同點是都使用 LAMBDA 作為內部“引擎”,並在遍歷矩陣時將值和累加器傳遞給它。

BYROW 函數:遍歷行並逐行傳回結果

BYROW函數用於將 LAMBDA 函數套用至指定範圍內的每一行,並傳回一個數組,數組中包含處理的每一行的值。這是一種非常高效的方法,可以逐行計算小計或統計信息,而無需垂直複製公式。

其一般語法為:

=BYROW(矩陣; LAMBDA(行; 表達式))

第一個參數是要遍歷的陣列或範圍(例如,B2:D7),第二個參數是一個 LAMBDA 函數,它逐行接收該範圍內的每一行作為參數。 LAMBDA 函數傳回要與該行關聯的值(可能是總和、平均值、邏輯校驗值等)。

假設你有一個位於B2:D7區域的資料表,你要計算每一行的小計。你可以在 E2 單元格中編寫類似這樣的程式碼:

=BYROW(B2:D7; LAMBDA(row; SUM(row)))

結果將是一個輸出向量,其中每個值對應於矩陣 B2:D7 的每一行,表示該行元素的總和。這樣,您無需逐行編寫 SUM 函數:BYROW 函數會自動完成並向下傳遞結果。

BYCOL 函數:按列套用 LAMBDA 函數

與 BYROW 函數非常相似, BYCOL函數旨在按列而不是按行遍歷數組。它對範圍內的每一列應用 LAMBDA 函數,並傳回一個結果數組,其中每個元素對應於一列。

其典型語法為:

=BYCOL(數組; LAMBDA(列; 表達式))

在這種情況下,LAMBDA 函數接收的參數是每一步處理矩陣的整列。與 BYROW 函數類似,該函數傳回一個向量,但它是專門用於處理按列統計的總和或指標的。

繼續前面的例子,如果您想計算B2:D7儲存格區域中每列的平均值,可以在 B8 儲存格中輸入以下公式:

=BYCOL(B2:D7; LAMBDA(列; AVERAGE(列)))

結果將是一個列數與 B2:D7 單元格相同的矩陣,其中每個位置包含該列的平均值。這樣,您就可以一次獲得所有平均值,而無需拖放公式或擔心相對引用。

MAKEARRAY 函數(MAKEARRAYFILE):建立計算數組

MAKEARRAY函數(有時也寫作 ARCHIVOMAKEARRAY)允許您透過指定行數和列數,並使用 LAMBDA 函數計算每個元素,來產生一個全新的陣列。它不是從現有範圍開始,而是從頭開始建立陣列。

其一般語法為:

=MAKEARRAY(rows; columns; LAMBDA(row; column; expression))

`rows`參數指定輸出矩陣的行數,`columns` 參數定義列數,LAMBDA 函數接收每次迭代中要計算的行索引和列索引作為參數。利用這些訊息,您可以建立幾乎任何數值或文字模式。

一個非常直觀的例子是創建一個矩陣,其中每個元素表示它自己的位置。在任何儲存格中,你都可以寫入類似這樣的內容:

=MAKEARRAYFILE(3; 2; LAMBDA(row; col; -(row & col)))

結果將是一個3 行 2 列的矩陣,其中每個值代表行和列的組合(例如,11、12、21、22、31、32),根據您輸入的計算進行轉換(在本例中,對行和列的連接應用負號)。

MAKEARRAY 的另一個有趣用法是將向量轉換為數組,同時控制要提取的元素數量。假設你想要建立一個包含某個垂直範圍內前 6 個值的陣列。你可以先用 MAKEARRAYFILE 建立一個位置數組,取得其中最小的 k 個位置值,最後使用 INDEX 從原始範圍內檢索實際元素。

一個結合了多個函數的公式範例可能具有以下結構:

  成為資料工程師的職業道路

=LET(arrPos; MAKEARRAYFILE(3; 2; LAMBDA(row; col; -(row & col))); arrPosF; MATCH(arrPos; LeastK(arrPos; SEQUENCE(6))); INDEX(G8:G13; arrPosF))

這裡,LET 用來定義中間名稱(arrPos、arrPosF),使用 ARCHIVOMAKEARRAY (3×2) 建立位置數組,使用 SMALLEST 和 SEQUENCE 選擇 6 個最小位置,最後使用 INDEX 從 G8:G13 範圍內傳回對應的值。這是一個強大的範例,展示如何結合 LAMBDA 函數和動態數組函數,在不使用巨集的情況下執行複雜的轉換。

MAP 函數:逐元素變換

MAP函數用於同時遍歷一個或多個數組,並傳回一個新數組,其中每個輸出元素都是透過將 LAMBDA 函數應用於相應的輸入元素計算得出的。它等價於函數式程式設計中的經典“map”函數。

基本語法為:

=MAP(矩陣1; LAMBDA_or_more_matrices)

最簡單的形式是,它接受一個陣列和一個 LAMBDA 函數,該函數接收數組中的每個值。這個 LAMBDA 函數轉換這些值,並傳回新版本,該新版本將作為輸出陣列的一部分,同時保持與原始陣列相同的維度。

例如,如果您想遍歷垂直範圍 A21:A26,如果數字為偶數則保留原始數字,如果數字為奇數則添加連字符,您可以使用類似這樣的代碼:

=MAP($A$21:$A$26; LAMBDA(param1; IF(ES.PAR(param1); param1; «-«)))

在這種情況下,MAP 函數會分析 A21 到 A26 中的每個元素。 LAMBDA 函數會使用 IS.EVEN 檢查該數字是否為偶數。如果是偶數,則傳回該數字本身;否則,傳回一個短橫線。最終結果是一個與原始範圍大小相同的數組,但每個元素都應用了轉換。

當您想要套用條件邏輯、文字轉換、值規範化或任何其他簡單操作時,這種方法非常有用,可以避免使用輔助列和重複公式。

掃描功能:累積和中間結果

SCAN函數用於檢查數組,它透過對每個值應用 LAMBDA 函數來產生輸出數組,該數組顯示了累積過程中的所有中間值。它與 REDUCE 函數非常相似,但它不是只傳回最終結果,而是保留每個步驟。

其一般語法為:

=SCAN(; 陣列; LAMBDA(累加器; 值))

第一個參數(可選)是累加器的初始值(例如,如果進行加法運算,則初始值為 0)。第二個參數是要遍歷的陣列或範圍。最後,LAMBDA 函數接收兩個參數:累加器(截至目前的部分結果)和正在處理的陣列的目前值。

在每個步驟中,SCAN 函數都會計算 LAMBDA 值,更新累加器,並在輸出矩陣中產生一個包含計算結果的新元素。這樣,就可以得到一系列累積值或漸進變換。

一個典型的例子是計算一組數值的累積總數(運行總數),並由此得出相對累計頻率。假設你的資料位於 A31:A36 儲存格區域,你想要計算絕對累計總數:

=SCAN(0; A31:A36; LAMBDA(累加; 參數1; 累加+參數1))

此公式遍歷 A31:A36 儲存格區域,將每個值加到前一個值的總和上。結果是一個數組,元素數量與原始區域相同,但每個位置顯示的是截至該位置的累積總和。

從累計總數出發,可以透過將每個累計總數除以總數,輕鬆計算累計百分比頻率。例如,您可以先使用 SUM 函數定義總數,然後再套用 SCAN 函數:

=LET(總計; SUM(A31:A36); SCAN(0; A31:A36; LAMBDA(累加; 參數1; (累加 + 參數1)))/總計)

在這種情況下,LET 將整個範圍 A31:A36 的總和賦值為total。然後 SCAN 產生累積值序列,並透過將其除以 total,即可得到每個步驟的相對累積頻率,所有這些都在一個矩陣公式中。

REDUCE 函數:將值簡化為單一累積值

REDUCE函數也透過對數組中的每個元素應用 LAMBDA 函數來遍歷數組,但與 SCAN 函數不同的是,REDUCE 函數只關注累加過程的最終結果。也就是說,它執行與 SCAN 函數相同的迭代,但只傳回累加器中的最後一個值。

其語法為:

=REDUCE(; 陣列; LAMBDA(累加器; 值))

就像在 SCAN 函數中一樣,initial_value設定累加器的起始點,matrix是要處理的範圍,LAMBDA 的參數是目前累加器和此時正在讀取的值。

一個非常典型的用法是計算累計和或累加運算,而你只關心最後一個結果。例如,要使用 REDUCE 函數計算 A1 到 A6 的總和,你可以這樣寫:

=REDUCE(0; A1:A6; LAMBDA(累加; 參數1; 累加 + 參數1))

這裡,REDUCE 函數遍歷 A1:A6 單元格,並在每一步將目前單元格的值(param1)加到累計值上。最後,它傳回一個值:總和。它在概念上類似於使用 SUM 函數,但 REDUCE 函數可以定義更複雜的累加邏輯,而不僅僅是簡單的求和。

  什麼是 Chart.js 以及如何在你的網站上建立互動式圖表

REDUCE 函數的強大之處在於它能夠在每一步都利用前一步的結果,並持續執行操作直至完成。這使得您可以實現以往需要在巨集中使用循環才能完成的複雜自訂計算。

使用 LAMBDA 和名稱管理器建立自訂函數

LAMBDA 最強大的功能之一是能夠使用 Excel 的名稱管理器將任何公式轉換為使用者自訂函數。這樣,您的函數就可以擁有自己的名稱,並像程式中的任何其他原生函數一樣使用。

典型的工作流程如下:首先,在儲存格中測試 LAMBDA 函數,包括函數定義和帶有範例參數的呼叫。驗證其運作正常並傳回預期結果後,複製 LAMBDA 函數定義對應的部分(不包括最後的呼叫),並將其貼上到名稱管理員中。

在名稱管理器中,建立一個新名稱(例如,MyVATFunction、MyDiscount、MyWeightedAverage 等),然後在「指涉」欄位中輸​​入:

=LAMBDA(var1; var2; …; varN; 計算)

從那一刻起,在工作簿的任何儲存格中,你都可以像呼叫內建函數一樣,透過寫入函數名稱來呼叫該函數,並按照定義參數值的順序傳遞參數值。

這樣做有兩個明顯的優點:首先,它讓你的電子表格更易讀(你看到的不再是冗長的公式,而是一個帶有描述性名稱的函數);其次,它將邏輯集中在一個地方。如果你以後想要更改計算,只要在名稱管理器中修改定義,所有使用它的公式都會自動更新。

實際操作方面及其他注意事項

要真正發揮 LAMBDA 函數及其相關功能的優勢,了解它們的一些實際特性和要求至關重要。首先,這些函數是現代 Excel 功能的一部分,因此您需要一個已包含動態陣列以及 LAMBDA、BYROW、BYCOL 等新函數的版本。這些功能通常在最新版本的 Microsoft 365 中可用。

另一個相關問題是效能:雖然 LAMBDA 函數和遍歷函數功能強大,但如果將它們應用於邏輯非常複雜的龐大範圍,則重新計算所需的時間可能會更長。因此,建議在設計 LAMBDA 函數時注重效率,避免冗餘計算,並利用 LET 等結構來定義可重複使用的中間值。

保持參數和函數命名規範的一致性至關重要。使用描述性名稱有助於您在幾個月後重新查看文件時,或者當其他人需要使用您的工作簿時,請理解其邏輯。例如,參數名稱為 amount、rate、dataRow 或 valuesCol 就比簡單的 x 或 yoa 清晰得多。

關於#CALC!錯誤,它通常出現在 Excel 無法計算陣列表達式或 LAMBDA 函數未傳回有效結果時。請務必檢查公式的輸出是否明確,如果使用陣列函數,請確保維度一致(例如,不要在未進行適當轉換的情況下合併不相容的大小範圍)。

最後,雖然 LAMBDA 函數在許多情況下可以省去 VBA 的使用,但它並不能完全取代 VBA。在某些情況下,巨集自動化仍然是最佳選擇,但對於大量的自訂計算和資料轉換,LAMBDA 函數及其相關函數可讓您在 Excel 傳統的公式環境中完成所有工作。

多虧了這些可能性,每天使用電子表格的人現在擁有了更靈活的工具來設計自己的計算、按行或列匯總信息、完全或部分遍歷矩陣、生成詳細的總計以及創建即時計算的新矩陣,所有這些都無需離開他們已經熟悉的公式語言。

程式設計技能
相關文章:
十大最熱門的程式設計技能