Excel - 如何使用 LAMBDA() 替换单元格中的多个字符或整个单词

问题描述 投票:0回答:2

冒着偏离主题的风险,我决定做一些问答,因为我对 MS 向 Excel365 引入的新功能感到非常兴奋;

LAMBDA()
功能。如果普遍认为这是偏离主题的,请告诉我,我可以删除问答。

LAMBDA()
函数基本上是您在Excel本身中创建自己的函数的方式。然后,您可以在整个工作簿中调用此函数。但它的绝对伟大之处(恕我直言)是它能够在函数内调用自身,因此是递归

我们都知道如果必须交换多个字符,或者清除字符串中的某些字符甚至整个单词,那么会出现繁琐的嵌套

SUBSTITUTE()
函数。所以问题是:我们如何避免这种情况并利用
LAMBDA()
来发挥我们的优势?

excel lambda excel-formula office365 excel-lambda
2个回答
11
投票

编辑2022年3月22日

根据新功能,人们可以选择:

=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
    - 我们希望用什么来替换我们的角色?

第四个参数是嵌套的

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()
 从数组中分割了足够的值,因此所有值都被替换。

现在您已经有了一个递归函数,您现在可以在整个工作簿中调用它。很酷。


0
投票
嗯,显然,最佳答案已经被声明,但是,就其价值而言,这并不能很好地处理相同类型的连续分隔符,

例如,假设我有“ØØ”,并且我希望仅用单个“Ø”替换此类实例;那么应用 SubAll 函数实际上会删除所有出现的“Ø” - 不仅仅是当它们出现在相邻的“对”中时:

(相反 - 添加一个额外的“Ø”,只需添加一个额外的)。

更加高效/精明(在我看来),减少 - 需要 Office 365。顺便说一句。

一个,

=REDUCE(B2,SEQUENCE(5),LAMBDA(a_,b_,SUBSTITUTE(a_,"¬¬","¬")))
    
© www.soinside.com 2019 - 2024. All rights reserved.