Excel 新增的 LAMBDA 函數徹底改變了在 Excel 中構建公式的方式。 Excel 公式是世界上使用最廣泛的編程語言,但編程中缺少一個更基本的原則,那就是使用公式語言定義自己的可重用函數的能力。 =LAMBDA 簡單地說, LAMBDA 允許使用 Excel 的公式語言定義自己的自定義函數。 Excel 已經允許定義自定義函數,但隻能通過使用完全不同的語言(例如 JavaScript )編寫它們。相反, LAMBDA 允許使用 Excel 自己的公式語言定義自定義函數。而且,一個函數可以調用另一個函數,因此可以部署單個函數調用的功能沒有限制。 可重用自定義函數 使用 LAMBDA ,可以接受在 Excel 中構建的任何公式,并将其包裝在 LAMBDA 函數中,并為其命名(如 “MYFUNCTION” )。然後在工作表的任何地方,都可以引用 MYFUNCTION ,在整個工作表中重新使用該自定義功能。 遞歸 可重用函數是利用 LAMBDA 的充分理由,此外還可以執行遞歸。例如,如果創建名為 MYFUNCTION 的 LAMBDA ,則可以在 MYFUNCTION 的定義中調用 MYFUNCTION 。這是以前隻有在 Excel 中通過腳本(如 VBA/JavaScript )才能實現的。下面将展示一個示例,說明如何利用它來構建以前不需要編寫腳本就無法實現的東西。 可重用自定義函數 在 Excel 中使用公式的一個更具挑戰性的部分是,經常會得到相當複雜的公式,這些公式在工作表中被多次重複使用(通常隻需複制 / 粘貼)。這會讓其他人很難閱讀和理解正在發生的事情,更容易出錯,并且很難發現和修複錯誤。使用 LAMBDA ,可以重複使用和可組合。為計劃多次使用的任何邏輯段創建庫,提供了方便并降低了出錯的風險。 Station IDs 例如,假設有一個站點 ID 列表,其中州編碼在 ID 中,想取出該值,如下圖 1 所示。 圖 1 使用 Excel 函數有很多方法來實現,下面是其中的一個公式: =LEFT(RIGHT(B3,LEN(B3)-FIND('-',B3)),FIND('-',RIGHT(B3,LEN(B3)-FIND('-',B3)))-1) 這種方式有兩個挑戰: 1. 錯誤 - 如果在邏輯中發現需要修複的錯誤,必須返回并在使用它的每個地方更新它,這樣可能會漏掉一些。此外,每當複雜的公式反複重複,而不是隻定義一次然後引用時,就會增加錯誤風險。例如,如果有一些站點 ID 看起來像 “105532-872332-WA-73” ,那麼上面的公式将無法使用這些站點 ID 。如果我發現這個錯誤并想修複它,那麼需要返回到使用該邏輯的每個單元格并更新它。 2. 可組合性 / 可讀性 - 如果不是原作者,很難知道這個公式的意圖是什麼,也很難将此邏輯與其他邏輯結合使用,例如如果想獲取站點 ID 并根據計算的位置進行查找。 使用 LAMBDA ,可以創建一個名為 GETLOCATION 的函數,并将公式邏輯放在該函數的定義中。 =GETLOCATION =LAMBDA(stationID, LEFT(RIGHT(stationID,LEN(stationID)-FIND('-',stationID)),FIND('-',RIGHT(stationID,LEN(stationID)-FIND('-',stationID)))-1)) 注意,我指定了函數将接受的參數(在本例中為 stationID )和函數的邏輯。現在,在電子表格中,可以像其他 Excel 函數一樣,簡單地将 GETLOCATION 編寫為公式并引用包含 stationID 的單元格。如果注意到有錯誤,會在一個地方修複它,而使用該函數的任何地方都會被修複。 圖 2 另一個額外的好處是,現在可以用額外的邏輯編寫該函數。例如,如果有每個地點的稅率表,可以編寫一個簡單的公式,根據 stationID 返回稅率。 =XLOOKUP(GETLOCATION(B3), table1[locations], table1[tax]) 關于如何使用此功能構建一組豐富的函數庫、使工作表更易于理解、更不容易出錯等,還有很多要深入研究的内容。這些函數甚至可以将數據類型作為參數。 遞歸 Excel 公式中缺失的一個重要部分是循環的能力,以動态定義的間隔在一組邏輯上重複。有一些方法可以手動配置 Excel 重新計算的時間間隔,以在一定程度上模拟這種情況,但這不是公式語言固有的。随着引入 LAMBDA ,情況發生了變化。 舉一個例子,雖然有點做作,但這是用來說明的一種簡單方式。 假設有一組字符串,想指定應該從這些字符串中動态删除哪些字符,如下圖 3 所示。 圖 3 因為指定的字符集不是靜态的,所以确實沒有任何好的方法來實現這一點。如果知道它總是一組固定的字符,可以做大量的嵌套邏輯,但這将非常複雜,而且容易出錯。更不用說,如果要删除的字符數大于所考慮的數量,将會失敗。 使用 LAMBDA ,可以創建一個名為 REPLACECHARS 的函數,該函數引用自身,允許遍曆要删除的字符列表: =REPLACECHARS =LAMBDA(textString,illegalChars, IF(illegalChars='',textString, REPLACECHARS( SUBSTITUTE(textString, LEFT(illegalChars, 1), ''), RIGHT(illegalChars, LEN(illegalChars)-1) ))) 注意,在 REPLACECHARS 的定義中,有對 REPLACECHARS 自身的引用。 IF 語句表示,如果沒有更多想移除的字符,則返回輸入 textString ,否則删除想移除字符中最左邊的每個字符。遞歸開始,請求使用更新的字符串再次調用 REPLACECHARS ,并調用其餘的想移除字符。這意味着它将一直調用自己,直到解析完要删除的每個字符,從而得到所需的結果。 不僅僅是數字和字符串 如果你一直關注 Excel 的改進,可能會注意到 Excel 中可以使用的數據類型有兩個顯著的改進: 1. 動态數組 - 可以傳遞值數組,而不是将單個值傳遞給函數,函數也可以返回值數組。 2. 數據類型 – 存儲在單元格中的值不再隻是字符串或數字。單個單元格可以包含豐富的數據類型和大量屬性。 函數可以将數據類型和數組作為參數,也可以将結果作為數據類型和陣列返回。構建的 lambda 也是如此。
有話要說...