本教程的目的是解释递归功能的概念,并证明在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中文网其他相关文章!

本文将指导您完成为Excel Pivot表和图表创建时间表的过程,并演示如何使用它以动态和引人入胜的方式与数据进行交互。 您的数据在Pivo中组织了

Excel可以使用其内置的“来自XML数据导入”功能导入XML数据。 进口成功在很大程度上取决于XML结构。结构良好的文件很容易导入,而复杂的文件可能需要手动映射。 最佳实践包括XML

本文说明了如何使用数据验证(包括单个和因列表)在Excel中创建下拉列表。 它详细介绍了该过程,为常见方案提供解决方案,并讨论诸如数据输入限制和PE之类的限制


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

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

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。