本文介绍使用LAMBDA创建的替换字符的自定义函数。=ReplaceChars(B3,'!@#$%^&*()[]<>-?.,','')ReplaceChars函数接受3个参数,第一个参数str是要被执行字符替换的文本字符串,第二个参数chars是文本字符串中要被替换的字符,第三个参数sub是用于替换文本字符串中找到的要被替换的字符。在下图1所示的示例中,ReplaceChars函数被设置为查找第二个参数中的标点符号(chars),并将其替换为空字符串(“”)。这个自定义的LAMBDA公式演示了一个称为递归的特性,即在函数中调用该函数本身。 SUBSTITUTE(str,LEFT(chars),sub), MID(chars,2,LEN(chars)-1),递归可以用来创建优雅、紧凑、非冗余的代码。然而,递归LAMBDA函数当前的一个缺点是它们不容易测试。因为它们不能直接在工作表上调试,因为此时的LAMBDA还没有定义名称,因此不能调用自己。当创建递归LAMBDA公式时,一个关键考虑因素是该公式如何通过调用自身来“退出”它执行的循环。一种常见的方法是,每次公式调用自己时都会损耗输入参数,然后在每次调用之前检查输入是否已完全耗尽,如果是,则退出。这样,输入参数就像计数器一样,倒数到零。这就是本文示例公式中采用的方法——chars参数就像一个计数器,每次公式调用自己时都会删除一个字符。在递归调用之前,IF函数用于检查chars是否为空。如果是,则公式返回str的当前值作为最终结果并退出。如果不是,则公式调用自身。由SUBSTITUTE函数处理用sub值替换在chars中的字符:SUBSTITUTE(str,LEFT(chars),sub)SUBSTITUTE函数一次仅执行一个替换,这就是为什么要使用递归的原因。参数str最初是提供给函数用于字符替换的文本字符串,但注意,每次函数调用自己时,该值都可能发生变化。要替换的字符由LEFT函数提供:用于替换的值来自于sub。理解这个公式的技巧是看SUBSTITUTE的结果被直接用于调用ReplaceChars函数,并且这个结果成为“下一个”str参数。此外,每次调用ReplaceChars时,字符串字符都会被MID函数耗掉一个字符,MID的结果将成为调用ReplaceChars时使用的字符的下一个值。MID(chars,2,LEN(chars)-1)一旦字符完全耗尽(即变为空字符串),IF函数内部的逻辑测试将返回TRUE,公式将返回str的当前值作为最终结果。自定义LAMBDA函数的行为与其他函数类似,因此可以通过嵌套轻松扩展功能。例如,可以去掉标点符号并替换为空格字符(“”),然后通过在TRIM函数中嵌套ReplaceChars来清理后面的内容,如下所示:=TRIM(ReplaceChars(B3,'!@#$%^&*()[]<>-?.,',''))TRIM函数将删除前导空格和尾随空格,并将单词之间的空格规范化为一个空格。这将避免当单词仅用标点符号分隔时出现组合的问题。注:本文学习整理自exceljet.net,供有兴趣的朋友参考。
|