LAMBDA 是 Excel 的新超級函數

目前,Microsoft Excel 有近五百個工作表函數可通過函數嚮導窗口 - 按鈕 fx 在公式欄中。 這是一個非常不錯的集合,但是,幾乎每個用戶遲早都會遇到此列表不包含他需要的功能的情況——僅僅是因為它不在 Excel 中。

到目前為止,解決這個問題的唯一方法是宏,即在 Visual Basic 中編寫自己的用戶定義函數(UDF = User Defined Function),這需要適當的編程技能,而且有時一點也不容易。 然而,隨著最新的 Office 365 更新,情況有所好轉——Excel 中添加了一個特殊的“包裝”功能 LAMBDA. 在它的幫助下,創建自己的函數的任務現在可以輕鬆而精美地解決。

下面我們來看看它的使用原理。

您很可能知道,Excel 具有多個日期解析函數,可讓您確定給定日期的日、月、周和年的編號。 但是由於某種原因,沒有確定季度數的函數,這也是經常需要的,對吧? 讓我們解決這個缺點並創建 LAMBDA 自己的新功能來解決這個問題。

步驟 1. 寫公式

讓我們從一個事實開始,以通常的方式,我們將在工作表單元格中手動編寫一個公式來計算我們需要什麼。 對於季度數字,可以這樣做,例如,如下所示:

LAMBDA 是 Excels 新的超級功能

步驟 2. 結束 LAMBDA 並進行測試

現在是時候應用新的 LAMBDA 函數並將我們的公式包裝在其中了。 函數語法如下:

=拉姆達(變量 1; 變量 2; ... 變量N ; 表達)

其中首先列出一個或多個變量的名稱,最後一個參數始終是使用它們的公式或計算表達式。 變量名稱不應看起來像單元格地址,並且不應包含點。

在我們的例子中,只有一個變量——我們計算季度數的日期。 讓我們為它調用變量,比如說,d。 然後將我們的公式包裝在一個函數中 LAMBDA 並用虛構的變量名替換原始單元格 A2 的地址,我們得到:

LAMBDA 是 Excels 新的超級功能

請注意,經過這樣的轉換,我們的公式(實際上是正確的!)開始產生錯誤,因為現在單元格 A2 中的原始日期沒有轉移到它。 為了測試和信心,您可以通過在函數後添加參數來傳遞參數 LAMBDA 在括號內:

LAMBDA 是 Excels 新的超級功能

步驟 3. 創建名稱

現在是簡單而有趣的部分。 我們開 名稱管理員 選項卡 (公式 - 名稱管理器) 並使用按鈕創建一個新名稱 創建 (創造). 想出並輸入我們未來函數的名稱(例如, 諾姆克瓦爾塔拉),並在現場 Link (參考) 仔細從公式欄中復制並粘貼我們的函數 LAMBDA,只有沒有最後一個參數(A2):

LAMBDA 是 Excels 新的超級功能

一切。 點擊後 OK 創建的函數可以在此工作簿的任何工作表上的任何單元格中使用:

LAMBDA 是 Excels 新的超級功能

在其他書籍中使用

因為創建於 LAMBDA 由於用戶定義的函數實際上是命名範圍,因此您可以輕鬆地使它們不僅在當前工作簿中可用。 使用該功能複制單元格並將其粘貼到另一個文件的工作表中的任何位置就足夠了。

LAMBDA 和動態數組

使用函數創建的自定義函數 LAMBDA 成功支持使用新的動態數組及其函數(過濾器, 優尼克, 年級) 於 2020 年添加到 Microsoft Excel。

假設我們要創建一個新的用戶定義函數,該函數將比較兩個列表並返回它們之間的差異——第一個列表中不在第二個列表中的元素。 生活的工作,不是嗎? 以前,為此他們使用了任何一個函數 VPR (VLOOKUP)、數據透視表或 Power Query 查詢。 現在您可以使用一個公式:

LAMBDA 是 Excels 新的超級功能

在英文版中,它將是:

=LAMBDA(a;b;ФИЛЬТР(a;СЧЁТЕСЛИ(b;a)=0))(A1:A6;C1:C10)

這裡的功能 COUNTIF 計算第一個列表的每個元素在第二個列表中出現的次數,然後函數 過濾器 只選擇那些沒有發生這些事件的人。 通過將這個結構包裹在 LAMBDA 並基於它創建一個帶有名稱的命名範圍,例如, 搜索分佈 – 我們將得到一個方便的函數,它以動態數組的形式返回比較兩個列表的結果:

LAMBDA 是 Excels 新的超級功能

如果源數據不是普通的,而是“智能”表,我們的函數也可以毫無問題地處理:

LAMBDA 是 Excels 新的超級功能

另一個示例是通過將文本轉換為 XML 來動態拆分文本,然後使用我們最近解析的 FILTER.XML 函數逐個單元格地解析它。 為了不每次都手動重現這個複雜的公式,將其包裹在 LAMBDA 中並基於它創建動態範圍會更容易,即一個新的緊湊且方便的函數,將其命名為,例如 RAZDTEXT:

LAMBDA 是 Excels 新的超級功能

該函數的第一個參數將是包含源文本的單元格,第二個參數是分隔符,它將以水平動態數組的形式返回結果。 功能代碼如下:

=拉姆達(t;d; 轉置(過濾器.XML(““&代替(t;d? “«)&»“;”//是)))

示例的列表是無窮無盡的——在您經常需要輸入相同的冗長和繁瑣公式的任何情況下,LAMBDA 函數將使生活變得更加輕鬆。

遞歸枚舉字符

之前的所有示例都只展示了 LAMBDA 函數的一個最明顯的方面——它用作“包裝器”,用於將長公式包裝在其中並簡化其輸入。 事實上,LAMBDA 還有另一個更深層次的方面,可以將其變成幾乎成熟的編程語言。

事實是 LAMBDA 函數的一個基本重要特徵是能夠在 遞歸 – 計算邏輯,在計算過程中函數調用自身。 從習慣上看,可能聽起來很毛骨悚然,但在編程中,遞歸是很常見的事情。 即使在 Visual Basic 的宏中,您也可以實現它,而現在,正如您所看到的,它已經出現在 Excel 中。 讓我們嘗試通過一個實際示例來理解這種技術。

假設我們要創建一個用戶定義的函數,該函數將從源文本中刪除所有給定的字符。 這樣一個功能的用處,我想,你不需要證明——在它的幫助下清除亂七八糟的輸入數據會很方便,對吧?

然而,與前面的非遞歸示例相比,有兩個困難等待著我們。

  1. 在開始編寫代碼之前,我們必須為函數取一個名字,因為在其中,這個名字已經被用來調用函數本身。
  2. 將這樣的遞歸函數輸入到單元格中並通過在 LAMBDA 之後的括號中指定參數來調試它(就像我們之前所做的那樣)將不起作用。 您必須立即“從頭開始”創建一個函數 名稱管理員 (名稱經理).

讓我們調用我們的函數,比如說,CLEAN,我們希望它有兩個參數——要清理的文本和作為文本字符串的排除字符列表:

LAMBDA 是 Excels 新的超級功能

讓我們像之前一樣在選項卡上創建 в 名字經理 命名範圍,將其命名為 CLEAR 並在字段中輸入 範圍 以下構造:

=LAMBDA(t;d;IF(d=””;t;CLEAR(替代(t;LEFT(d);””);MID(d;2;255))))

這裡變量t是要清除的原文,d是要刪除的字符列表。

這一切都是這樣工作的:

迭代1

正如您可能猜到的那樣,片段 SUBSTITUTE(t;LEFT(d);””) 將源文本 t 中要刪除的集合 d 左側字符的第一個字符替換為空文本字符串,即刪除“一個”。 作為中間結果,我們得到:

Vsh zkz n 125 盧布。

迭代2

然後函數調用自己,作為輸入(第一個參數)接收上一步清理後剩下的內容,第二個參數是排除字符的字符串,不是從第一個字符開始,而是從第二個字符開始,即“BVGDEEGZIKLMNOPRSTUFHTSCHSHSHCHYYYYY. ,” 沒有初始的“A”——這是由 MID 函數完成的。 和以前一樣,該函數從其餘字符 (B) 的左側開始獲取第一個字符,並將其在給它的文本 (Zkz n 125 盧布) 中替換為一個空字符串——我們得到一個中間結果:

125 盧比。

迭代3

該函數再次調用自身,作為第一個參數接收要在前一次迭代中清除的文本(Bsh zkz n 125 ru.),作為第二個參數,排除的字符集被一個字符截斷為左邊,即“VGDEEGZIKLMNOPRSTUFHTSCHSHSHCHYYYYUYA.”,沒有首字母“B”。 然後它再次從該集合中獲取左側的第一個字符 (B) 並將其從文本中刪除——我們得到:

sh zkz n 125 茹。

等等——我希望你能明白。 在每次迭代中,要刪除的字符列表將在左側截斷,我們將搜索集合中的下一個字符並將其替換為 void。

當所有字符用完時,我們需要退出循環——這個角色只是由函數執行 IF (如果),我們的設計被包裹在其中。 如果沒有剩餘的字符要刪除(d=””),則函數不應再調用自身,而應簡單地以最終形式返回要清除的文本(變量 t)。

單元格的遞歸迭代

同樣,您可以在給定範圍內實現單元格的遞歸枚舉。 假設我們要創建一個名為 更換清單 根據給定的參考列表批量替換源文本中的片段。 結果應如下所示:

LAMBDA 是 Excels 新的超級功能

那些。 在我們的功能 更換清單 將有三個論點:

  1. 帶有要處理的文本的單元格(源地址)
  2. 具有要從查找中搜索的值的列的第一個單元格
  3. 查找中具有替換值的列的第一個單元格

該函數應在目錄中從上到下依次替換左列中的所有選項 到右欄中的相應選項 替代. 您可以使用以下遞歸 lambda 函數來實現這一點:

LAMBDA 是 Excels 新的超級功能

這裡,變量 t 存儲來自下一列單元格的原始文本 地址,變量 n 和 z 指向列中的第一個單元格 и 替代分別。
和前面的例子一樣,這個函數首先用函數替換原來的文本 替代 (代替) 目錄第一行的數據(即 SPbon 聖彼得堡),然後調用自身,但在目錄中向下移動到下一行(即替換 聖彼得堡 on 聖彼得堡)。 然後通過降檔再次調用自身 - 並替換已經 彼得 on 聖彼得堡 等。

每次迭代時的下移由標準的 excel 函數實現 處置 (抵消),在這種情況下,它具有三個參數——原始範圍、行移位 (1) 和列移位 (0)。

好吧,一旦我們到達目錄的末尾(n = “”),我們就必須結束遞歸——我們停止調用自己並顯示在源文本變量 t 中所有替換後累積的內容。

就這樣。 沒有棘手的宏或 Power Query 查詢——整個任務由一個函數解決。

  • 如何使用 Excel 新增的動態數組函數:FILTER、SORT、UNIC
  • 使用 SUBSTITUTE 函數替換和清理文本
  • 在 VBA 中創建宏和用戶定義函數 (UDF)

發表評論