本教程的目的是解釋遞歸功能的概念,並證明在Excel中創建遞歸lambdas的通用方法。我們將深入探索各個方面,以使您可以輕鬆地在工作表中遵循和復制。
隨著Lambda功能的引入,Excel中的遞歸計算已成為任何人,而不僅僅是VBA程序員。簡而言之,您現在可以構建表現得像編程語言的公式,並讓您以如此少,如此快的速度取得如此多的成就:)
請記住,本教程中討論的示例暗示您已經知道Lambda的語法和基本用途。如果不是這樣,它就可以從要點開始:如何在Excel中寫和使用lambda。
遞歸lambda功能
為了確保每個人都在同一頁面上,讓我們首先確定什麼是遞歸功能。
在計算機科學中,遞歸是一種解決函數直接或間接調用自己的問題的方法。這樣的功能稱為遞歸。基本上,遞歸函數通過迭代起作用,並通過解決相同問題的較小實例找到解決較大問題的解決方案。
當前,Lambda是唯一支持遞歸的Excel功能,使您能夠為無編碼的複雜問題創建緊湊而優雅的解決方案。
在VBA中,遞歸通常是使用A for…下一步或循環時進行的。 lambda通常依靠IF函數來測試布爾條件,如果條件為真或錯誤,則反復出現。
這是遞歸lambda功能的結構,其最簡單的形式:
= lambda(x,y,…, '聲明參數,如果(logical_test, '測試條件mylambda(), 'recurse如果條件評估為true value_if_false) '如果條件評估為false,則退出)關鍵點是停止遞歸電話永遠繼續。為此,您應該提供結局案例(也稱為停止案例或基本案例)。如果沒有提供出口點,則公式將不斷迭代,直到您的計算機崩潰為止,只是開玩笑,它會拋出#num!錯誤。
與非恢復功能相比,遞歸lambdas更難編寫,測試和調試。它類似於舊的雞肉和雞蛋謎語 - 為了使功能正常工作,必須自稱為自己。要調用自己,該功能必須正常工作:)
遞歸lambda的示例以刪除不需要的字符
從外部來源導入數據時,垃圾字符通常會潛入,您需要以某種方式找到一種清潔數據的方法。
替換所有功能可以通過無需替換給定字符的所有出現,但一次只能處理一個字符。
更快,更方便的是列出某些單元格中的所有不需要的角色,並使用公式一口氣消除它們。遞歸lambda正是您所需要的:
=LAMBDA(data, chars, IF(chars"", RemoveChars(SUBSTITUTE(data, LEFT(chars, 1), ""), RIGHT(chars, LEN(chars) -1)), data))
我們的自定義lambda函數命名為removeChars ,它需要兩個輸入參數:
- 數據- 一個細胞或要清潔的細胞範圍。
- 字符- 不需要的字符要刪除。可以以文本字符串或單元格引用的形式提供。在單元格中,除非您也要消除空間,否則應在沒有空格的情況下列出字符。
在高水平上,這是函數的作用:
RemoveChars函數循環通過排除列表( chars ),並一次清除一個字符。在每個遞歸調用之前,IF函數評估其餘的字符。如果字符串不是空的(chars “”),則該函數會自調用。一旦處理了最後一個字符,迭代過程就會完成 - 該公式以當前形式和退出返回數據。
反向邏輯也將起作用:如果chars字符串為空(chars =“”),則返回當前數據並退出;否則,請調用removeChars函數:
=LAMBDA(data, chars, IF(chars="", data, RemoveChars(SUBSTITUTE(data, LEFT(chars, 1), ""), RIGHT(chars, LEN(chars) -1))))
無論您選擇哪種方法,結果都將完全相同:
提示。通過正則表達式可以輕鬆完成相同的任務。有關更多詳細信息,請參閱Excel Regex刪除特殊字符。
如何在Excel中寫遞歸lambda
我想從免責聲明開始:)沒有記錄的在Excel中構建遞歸lambdas的方法,鑑於該功能是全新的,這是可以闡明的。我將分享自己的方式,這可能對您有幫助。
創建核心公式
通常,您首先要編寫模仿Lambda功能所需行為的核心公式。在我們的情況下,最終的目標是無需替換特定的角色,而Excel已經為此提供了理想的工具 - 替代功能:
替代(text,old_text,new_text,[instance_num])為了替代,我們需要提供:
- 文字- 替換字符的文字。就我們而言,這是A2中的文本字符串。
- old_text-要替換的字符。我們需要檢查D2中的每個字符,並且有理由從最左邊的角色開始。左功能可以輕鬆為我們獲取:
LEFT(D2, 1)
- new_text-用替換old_text的字符。顯然,這是一個空字符串(“”)。
- instance_num是可選的,在我們的情況下不需要,因此省略了。
結果,我們的核心公式採用此形式:
=SUBSTITUTE(A2, LEFT(D2, 1), "")
由於替代只能一次進行一次替換,因此必須執行D2中的“排除列表”中的字符多次。問題是 - 我們如何強迫它處理下一個角色?這是答案:
在每次迭代中,我們將從左側剝離一個角色,即已經看過的角色。與Len結合使用的正確功能很容易做到這一點:
=RIGHT(D2, LEN(D2) -1)
請注意,每個隨後的替代者都使用上一個替代的結果作為文本參數,即它使替換不是在原始字符串(A2)中,而是在先前的替代函數(B2)返回的字符串中:
將核心公式轉換為lambda功能
如您所記得的那樣,我們的自定義功能應該被命名為removeChars ,它將有2個參數:數據和字符。
您的工作是指示功能如何計算每個參數:
- 數據- 替換字符的字符串。它由替代公式提供。
- 字符- 要刪除的字符。它由正確的公式提供。
您要做的就是簡單地將上面討論的兩個公式放置在removechars函數的內部,以逗號或用於分離excel中函數參數的任何字符(由在區域設置中設置的列表分隔符確定)。
RemoveChars(SUBSTITUTE(A2, LEFT(D2, 1), ""), RIGHT(D2, LEN(D2) -1))
請記住,lambda在參數而不是單元格引用上運行,下一步是將A2更改為數據,而D2則將D2更改為Chars :
RemoveChars(SUBSTITUTE(data, LEFT(chars, 1), ""), RIGHT(chars, LEN(chars) -1))
RemoveChars功能已完成。可悲的是,此時無法進行測試,我們只能依靠先前測試的結果,並在需要時進行調試。
使lambda函數恢復自身遞歸
這是將“理論公式”變成工作解決方案的關鍵部分。
與任何自定義lambda一樣,您從聲明參數開始:
=LAMBDA(data, chars,
接下來,您將評估一定條件,並取決於結果調用遞歸或退出。建立退出點是至關重要的考慮因素。如果您不這樣做,那麼您的公式將無法正常工作,因為它永遠不會擺脫循環。
在我們的情況下,IF函數檢查字符列表是否不是空白(chars “”)。如果true(字符不是空的),我們將調用removeChars函數。如果false(字符為空),我們將其當前表單和退出返回數據。
這是通用方法:
=LAMBDA(data, chars, IF(chars"", RemoveChars(…), data))
這是其完整形式的真實公式:
=LAMBDA(data, chars, IF(chars"", RemoveChars(SUBSTITUTE(data, LEFT(chars, 1), ""), RIGHT(chars, LEN(chars) -1)), data))
另外,您可以檢查字符是否為空白(chars =“”)。如果是真的,請返回數據並退出;如果false通話removeChars。
概念:
=LAMBDA(data, chars, IF(chars="", data, RemoveChars(…)))
完整公式:
=LAMBDA(data, chars, IF(chars="", data, RemoveChars(SUBSTITUTE(data, LEFT(chars, 1), ""), RIGHT(chars, LEN(chars) -1))))
命名您的lambda定義功能
命名遞歸lambdas與命名他們的非徵收同齡人沒有什麼不同:
- 按CTRL 3快捷方式打開名稱管理器,然後單擊“新” 。
- 在“新名稱”對話框中,執行以下操作:
- 在名稱框中,鍵入函數的名稱: removeChars 。
- 將範圍設置為工作簿。
- 在指盒子中,粘貼您的lambda公式,以確保其以平等標誌開頭。
- 可選地,在評論框中輸入參數的描述,以供進一步參考。
- 單擊確定以保存您的新功能。
如何在Excel中使用遞歸lambda
這是最簡單的部分:)一旦您的lambda函數獲取名稱,就可以像其他任何本機功能一樣使用它。
從最終用戶的角度來看,我們的自定義函數的語法與以下方式一樣簡單:
RemoveChars(數據,字符)例如,要清潔A2:A10(數據)中的數據,我們在D2( chars )中鍵入不需要的字符,然後在B2中輸入以下公式:
=RemoveChars(A2:A10, D2)
您可能知道,在Excel 356中,每個公式本質上都是一個動態的陣列公式。因此,將公式僅輸入一個單元格(B2),我們立即獲得所有結果(此行為稱為溢出)。
如果您喜歡傳統的“一個公式 - 一個單元格”的行為,請使用單元格引用進行數據(A2),然後用$符號鎖定Chars單元格($ d $ 2),以防止其在將公式調低時更改:
=RemoveChars(A2, $D$2)
上面的公式用於B2,然後將其拖動B10:
您可以將其直接作為文本字符串直接提供給公式:
=RemoveChars(A2:A10, "_^*/&%")
筆記。由於核心公式中使用的替代功能對病例敏感,因此我們的自定義功能將大寫和小寫字母視為不同的字符。如果要刪除某個字符,例如“ X”,無論字母案例如何,請在字符字符串中同時包含“ X”和“ X”。
了解遞歸
理解遞歸lambdas的線索是確切地知道每次迭代會發生什麼。在我們的示例中,有兩件事:
- 上一個替代品的結果成為下一個呼叫的新數據參數,就好像我們使用了嵌套的替代功能一樣。
- 字符字符串由一個字符減少。您可以將其視為一種倒計時。一旦Chars字符串變為空,迭代過程就會停止,該公式將以目前的形式返回數據作為最終結果。
下表可以幫助您更好地可視化遞歸過程:
更多遞歸lambda功能的示例
在以下示例中,我們將研究如何使用新功能擴展現有的Lambda功能以根據您的需求進行調整。
示例1。刪除不需要的字符並修剪額外的空間
除了各種無關的字符外,您的數據還可能包含過多的空間。為了擺脫它們,您可以像任何內置功能一樣嵌套在裝飾中的內心:
=TRIM(RemoveChars(A2:A10, F2))
要查看效果,請比較B列和D中的結果。在後一種情況下,不僅要刪除不必要的字符,而且都被刪除了所有領先和落後空間,而內部空間則減少到單詞之間的單個空間字符:
如果您不想每次都要築巢,則可以在lambda本身內部進行一次設置:
=LAMBDA(data, chars, TRIM(IF(chars"", RemoveTrim(SUBSTITUTE(data, LEFT(chars, 1), ""), RIGHT(chars, LEN(chars) -1)), data)))
我們的改進功能被命名為removetrim ,它的工作方式就像魅力:
=RemoveTrim(A2:A10, D2)
示例2。用同一字符替換多個字符
在某些情況下,用您指定的另一個字符替換一些不同的字符是有意義的。實際上,這是我們的RemoveChars函數實際上所做的 - 用一個空字符串(“”)代替指定的字符。但是,替換字符是硬編碼的,而我們要直接在公式中定義它。為了完成它,我們只需要在函數中添加另一個參數,例如new_char 。
因此,我們的新功能,讓我們命名替換,將具有以下語法:
替換(數據,字符,new_char)為了將RemoveChars轉變為替代eChaceChars ,有3個小編輯要進行:
- 定義3 rd參數-new_char 。
- 用new_char替換硬編碼的空字符串(“”)。
- 將new_char傳遞到替代方案作為第三個參數的功能。
結果,我們獲得了另一個有用的lambda來代替多個字符遞歸:
=LAMBDA(data, chars, new_char, IF(chars"", ReplaceChars(SUBSTITUTE(data, LEFT(chars), new_char), RIGHT(chars, LEN(chars)-1), new_char), data))
例如,如果您的供應商突然更改其ID或SKUS格式,則可以使用此公式使用適當的一個(E2)替換所有不適當的字符(E1):
=ReplaceChars(A2:A6, E1, E2)
示例3。一次將多個值替換為其他值
此示例是一個之前的邏輯擴展。這次,我們將替換整個單詞(或字符串),而不是單個字符,每個單詞都會有其自己的替換值。
由於舊值和新值將放置在單獨的單元格中(如下屏幕截圖所示),因此我們在上一個示例中使用的正確函數無法使用。要循環遍歷舊的/新對,我們需要找出其他東西。嗯,Excel中似乎有一個函數,可以從給定的單元中移動指定數量的行和列。是的,那是偏移!
通過建立的主要方法,編寫替換功能沒什麼大不了的:
替換(數據,舊,新)對於數據,我們僅以基本形式使用替代函數,僅將舊值替換為新值:
SUBSTITUTE(data, old, new)
為了獲得舊值,我們將從舊列表上的最上方單元格開始,然後在每次交互時向下移動1行:
OFFSET(old, 1, 0)
為了獲得新價值,我們將做完全相同,但是當然,在新列表中:
OFFSET(new, 1, 0)
最後,在IF的幫助下實現已經熟悉的退出策略,您的新功能遞歸lambda已準備就緒(請不要忘記在名稱管理器中命名:)
=LAMBDA(data, old, new, IF(old"", ReplaceAll(SUBSTITUTE(data, old, new), OFFSET(old, 1, 0), OFFSET(new, 1, 0) ), data))
使用A2:A10中的源數據,D列在D2中的舊值以及E 2中E列中的新值,您可以使用此簡單公式進行多個替代:
=ReplaceAll(A2:A10, D2, E2)
結果,B2中的單個公式替換了A2:A10中的所有縮寫,用相應的全名:
遞歸lambdas vs. VBA用戶定義的功能
具有編程背景的高級Excel用戶可能很好奇,可以看到遞歸lambda函數與可比的VBA代碼的相關性。好吧,讓我們看看。
遞歸lambda刪除多個字符
如您所知,這是非功能性偽代碼。我們將其放在VBA編輯器中,以熟悉的形式代表算法,以更好地了解發生了什麼:)
用戶定義的功能以刪除多個字符遞歸
這就是可以用VBA編寫類似的用戶定義函數的方式:
用戶定義的函數以刪除多個字符非恢復的功能
也可以使用非恢復方法編寫類似的功能。在這種情況下,我們將removeChars作為單獨的函數編寫,並在Chars String不空時從removecharsnonRecursive函數中調用它。
可以以不同的方式完成相同的任務。您可以通過1到Len(字符)的排除字符迭代,並用一個空字符串替換數據中的字符。 MID函數用於從chars字符串一對一地提取每個字符。
與VBA用戶定義的功能相比,使用lambdas的好處是什麼?首先,它們不需要保存工作簿作為宏啟用的.xlsm文件,並為您節省每個開口啟用宏的麻煩。
希望本教程可以幫助您了解遞歸lambda在Excel中的樣子。我感謝您閱讀,並希望下週在我們的博客上見到您!
練習工作簿下載
遞歸lambda示例(.xlsx文件)VBA用戶定義功能(.xlsm文件)
以上是Excel中的遞歸lambda功能與示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Google主張Countif:綜合指南 本指南探討了Google表中的多功能Countif函數,展示了其超出簡單單元格計數的應用程序。 我們將介紹從精確和部分比賽到Han的各種情況

本教程提供了共享Excel工作簿,涵蓋各種方法,訪問控制和衝突解決方案的綜合指南。 現代Excel版本(2010年,2013年,2016年及以後)簡化了協作編輯,消除了M的需求

本教程探討了將.xls文件轉換為.jpg映像的各種方法,包括內置的Windows工具和免費的在線轉換器。 需要創建演示文稿,安全共享電子表格數據或設計文檔嗎?轉換喲

本教程闡明了Excel名稱的功能,並演示瞭如何定義單元格,範圍,常數或公式的名稱。 它還涵蓋編輯,過濾和刪除定義的名稱。 Excel名稱雖然非常有用,但通常是氾濫的

本教程闡明了平均值的標準偏差和標準誤差之間的區別,指導您掌握標準偏差計算的最佳Excel函數。 在描述性統計中,平均值和標準偏差為interinsi

該Excel教程演示瞭如何計算正方根和n根。 找到平方根是常見的數學操作,Excel提供了幾種方法。 計算Excel中正方根的方法: 使用SQRT函數:

解鎖Google表的力量:初學者指南 本教程介紹了Google Sheets的基礎,這是MS Excel的強大而多才多藝的替代品。 了解如何輕鬆管理電子表格,利用關鍵功能並協作


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器