因此,让我们创建一个需要清理的字符串的示例;a+b#c%d*e(f)g!h.

中的公式B1:
=SUBALL(A1,"+#%*()!","")
SUBALL()我通过“名称管理器”菜单创建的函数名称在哪里LAMBDA(),内容如下:
=LAMBDA(str,chrs,sub,IF(chrs="",str,SUBALL(SUBSTITUTE(str,LEFT(chrs),sub),RIGHT(chrs,LEN(chrs)-1),"")))
这个公式的核心是三个变量:
str- 对要清理的字符串的引用。
chrs- 要替换的字符串。
sub- 我们希望我们的角色被替换成什么?
第 4 个参数是一个嵌套的IF(). 由于递归调用,我们需要一种摆脱无限循环的方法。因此我们测试 if chrs=""。如果TRUE我们返回包含所有替换字符的最终字符串。如果我们再次FALSE调用该函数。这里最棒的是我们可以改变所有变量!这很重要,因为我们可以因此删除最左边的字符,并且可以剪切替换字符串的相同字符。SUBSTITUTE()
我们还可以将其提升一个档次并替换数组中的元素。例如:

中的公式B1:
=SUBALL(A1,{"STR1","STR2","STR3"},"-")
请注意,您还可以硬编码单个值或引用单个单元格(或任何垂直范围)。显然这会影响我们处理递归的方式。可能有一个更漂亮的方法,但我想出了:
=LAMBDA(str,del,sub,IF(COUNTA(del)=1,SUBSTITUTE(str,@del,sub),SUBALL(SUBSTITUTE(str,@del,sub),INDEX(del,SEQUENCE(COUNTA(del)-1,,2)),sub)))
该函数的核心仍然是相同的,但如前所述,我们现在使用了一个数组。所以我们IF()将不再检查空值,而是检查数组中是否只有一个元素。如果是这样,它将执行单个SUBSTITUTE(),但如果不是,则它将递归调用,SUBALL()直到我们从数组中切出足够多的值,INDEX()以便替换所有值。
有了它,您现在可以在整个工作簿中调用它的递归函数。很酷。