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中进行拼写检查的各种方法:手动检查,VBA宏和使用专用工具。 学习检查单元格,范围,工作表和整个工作簿中的拼写。 虽然Excel不是文字处理器,但它的spel

本教程提供了共享Excel工作簿,涵盖各种方法,访问控制和冲突解决方案的综合指南。 现代Excel版本(2010年,2013年,2016年及以后)简化了协作编辑,消除了M的需求

本教程解释了绝对价值的概念,并演示了ABS函数的实用Excel应用,以计算数据集中的绝对值。 数字可能是正面的或负数的,但有时只有正值是需要的

Google主张Countif:综合指南 本指南探讨了Google表中的多功能Countif函数,展示了其超出简单单元格计数的应用程序。 我们将介绍从精确和部分比赛到Han的各种情况

本教程演示了如何通过对行进行分组来简化复杂的Excel电子表格,从而使数据易于分析。学会快速隐藏或显示行组,并将整个轮廓崩溃到特定的级别。 大型的详细电子表格可以是

本教程探讨了将.xls文件转换为.jpg映像的各种方法,包括内置的Windows工具和免费的在线转换器。 需要创建演示文稿,安全共享电子表格数据或设计文档吗?转换哟

本教程向您展示了如何在Google表中创建各种图表,并为不同的数据方案选择正确的图表类型。 您还将学习如何创建3D和gantt图表,以及如何编辑,复制和删除图表。 可视化数据是CRU
