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

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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