Excel - 我们如何使用 LAMBDA() 替换单元格中的多个字符或整个单词
Excel - How can we replace multiple characters or whole words in a cell using LAMBDA()
冒着跑题的风险,我决定进行一些问答,因为我对 MS 向 Excel365 引入的新功能感到非常兴奋; LAMBDA()
函数。如果普遍认为这是题外话,请告诉我,我可以撤下问答。
LAMBDA()
函数基本上是您在 Excel 中创建自己的 自己的 函数的方法。然后您可以继续在整个工作簿中调用此函数。但绝对伟大的事情(恕我直言)是它能够在函数内调用自己,因此是 递归!
我们都知道,如果必须交换多个字符,或者从某些字符甚至整个单词中清除字符串,那么繁琐的嵌套 SUBSTITUTE()
函数。所以问题是:我们如何避免这种情况并利用 LAMBDA()
我们的优势?
编辑 22-3-2022:
根据新功能,可以选择:
=CONCAT(TEXTSPLIT(A1,{"+","#","%","*","(",")","!"}))
下面我将使用 LAMBDA()
完整地保留原始答案:
原答案:
那么让我们创建一个需要清理的字符串示例; 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),"")))
这个公式的核心是 3 个变量:
str
- 对要清理的字符串的引用。
chrs
- 要替换的字符串。
sub
- 我们希望我们的角色被替换成什么?
第 4 个参数是嵌套的 IF()
。由于递归调用,我们需要一种摆脱无限循环的方法。因此我们测试是否 chrs=""
。如果 TRUE
我们 return 包含所有替换字符的最终字符串。如果 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()
从数组中切出足够的值,以便所有值都被替换。
好了,这是一个递归函数,您现在可以在整个工作簿中调用它。很帅
冒着跑题的风险,我决定进行一些问答,因为我对 MS 向 Excel365 引入的新功能感到非常兴奋; LAMBDA()
函数。如果普遍认为这是题外话,请告诉我,我可以撤下问答。
LAMBDA()
函数基本上是您在 Excel 中创建自己的 自己的 函数的方法。然后您可以继续在整个工作簿中调用此函数。但绝对伟大的事情(恕我直言)是它能够在函数内调用自己,因此是 递归!
我们都知道,如果必须交换多个字符,或者从某些字符甚至整个单词中清除字符串,那么繁琐的嵌套 SUBSTITUTE()
函数。所以问题是:我们如何避免这种情况并利用 LAMBDA()
我们的优势?
编辑 22-3-2022:
根据新功能,可以选择:
=CONCAT(TEXTSPLIT(A1,{"+","#","%","*","(",")","!"}))
下面我将使用 LAMBDA()
完整地保留原始答案:
原答案:
那么让我们创建一个需要清理的字符串示例; 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),"")))
这个公式的核心是 3 个变量:
str
- 对要清理的字符串的引用。chrs
- 要替换的字符串。sub
- 我们希望我们的角色被替换成什么?
第 4 个参数是嵌套的 IF()
。由于递归调用,我们需要一种摆脱无限循环的方法。因此我们测试是否 chrs=""
。如果 TRUE
我们 return 包含所有替换字符的最终字符串。如果 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()
从数组中切出足够的值,以便所有值都被替换。
好了,这是一个递归函数,您现在可以在整个工作簿中调用它。很帅