Excel中的遞歸lambda功能與示例
本教程的目的是解釋遞歸功能的概念,並證明在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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

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

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

本教程演示瞭如何通過對行進行分組來簡化複雜的Excel電子表格,從而使數據易於分析。學會快速隱藏或顯示行組,並將整個輪廓崩潰到特定的級別。 大型的詳細電子表格可以是

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

本教程向您展示瞭如何在Google表中創建各種圖表,並為不同的數據方案選擇正確的圖表類型。 您還將學習如何創建3D和gantt圖表,以及如何編輯,複製和刪除圖表。 可視化數據是CRU

本教程演示了各種Excel公式,以檢查單元格是否包含特定值,包括文本,數字或字符串部分。 它涵蓋了使用if,istext,isnumber,搜索,查找,cuntif,centeck,sumproduct,vlookup和neste的情況

本教程演示瞭如何在Microsoft Excel中執行算術計算並修改公式中的操作順序。 Excel的功能遠遠超出了簡單的添加。由於其H,它可以處理複雜的計算
