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

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

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

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

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

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)