您可以在不嵌套的情况下对许多值使用 SUBSTITUTE 吗?

urd*_*boy 5 excel excel-formula

有没有办法一次交换多个字符串实例而不嵌套?

例如,假设我想从字符串中删除以下值的所有实例:

  • 目标
  • 沃尔玛
  • CVS

输入字符串: “我去了 Target 而不是沃尔玛,但我真的想去 CVS”
输出字符串: “我去了而不是但我真的想去”


我尝试了输入=SUBSTITUTE(A1,H1:H3,"")在哪里以及要替换的字符串,但这仅交换第一个字符串A1H1:H3

我知道如何在 VBA 中执行此操作,但该项目无法使用 VBA

Jvd*_*vdV 7

22 年 4 月 27 日更新

由于LAMBDA()它的辅助函数现已发布到 ms365 的生产版本,因此可以使用REDUCE()

=TRIM(REDUCE(A1,{"Target","Walmart","CVS"},LAMBDA(a,b,SUBSTITUTE(a,b,""))))
Run Code Online (Sandbox Code Playgroud)

或者,甚至尝试:

=TEXTJOIN(" ",,TEXTSPLIT(A1,{" ","Target","Walmart","CVS"}))
Run Code Online (Sandbox Code Playgroud)

但是,请注意可能的误报,并且SUBSTITUTE()两者TEXTSPLIT()都区分大小写,因此对于这些正确的单词来说,它似乎效果很好。为了应对误报,首先将空格更改为三倍空格,然后从那里开始(或使用仍然有效的旧答案)。另一种选择是嵌套FILTER()

=TEXTJOIN(" ",,REDUCE(TEXTSPLIT(A1," ",,1),{"Target","Walmart","CVS"},LAMBDA(a,b,FILTER(a,a<>b))))
Run Code Online (Sandbox Code Playgroud)

旧答案(仍然有效,因为它避免了误报):

我想我会回答“是的,这是可能的,但是......”。这可能有点牵强,但我注意到你没有使用任何标点符号,这让我相信我们可以在空格上分割一个字符串,并以这种方式过滤掉不需要的部分,将需要的部分拼凑在一起:

在此输入图像描述

公式为A2

=TEXTJOIN(" ",,FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s["&TEXTJOIN(" and ",,".!= '"&B1:B3&"'")&"]"))
Run Code Online (Sandbox Code Playgroud)

现在,您可以向不需要的字符串范围添加任意数量的值,而无需进一步调整公式。

  • 请注意,这确实需要 Excel 2019 或更高版本才能TEXTJOIN()工作。对于 Excel 2019,您还需要通过 进行确认CtrlShiftEnter
  • 另请注意,一旦您开始使用标点符号,就需要进行一些调整。
  • 最后一点是FILTERXML()区分大小写。


Sco*_*ner 6

在嵌套之外使用 SUBSTITUTE 无法完成所需的操作。未来LAMBDA将成为一种选择。

目前,为了向后兼容,这里有一个 UDF,它创建一个函数,该函数接受许多输入并将其替换为所需的输出。

它使用参数数组,因此还可以创建单独的替换:

Function SUBALL(str As String, ParamArray arr() As Variant) As String
    Dim i As Long
    For i = LBound(arr) To UBound(arr) Step 2
        Dim rngarr As Variant
        rngarr = arr(i)
        
        If UBound(arr) > i Then
            Dim rpArr As Variant
            rpArr = arr(i + 1)
        Else
            Dim df As Boolean
            df = True
        End If
        
        If TypeName(rngarr) = "String" Then
            If df Then
                str = Replace(str, rngarr, "")
            Else
                str = Replace(str, rngarr, rpArr)
            End If
        Else
            Dim j As Long
            For j = LBound(rngarr, 1) To UBound(rngarr, 1)
                If df Then
                    str = Replace(str, rngarr(j, 1), "")
                Else
                    str = Replace(str, rngarr(j, 1), rpArr(j, 1))
                End If
            Next j
        End If
    Next i
    
    SUBALL = str
End Function
Run Code Online (Sandbox Code Playgroud)

它默认替换为""

所以在这个例子中:

=SUBALL(A1,H1:H3)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但我们也可以在指定输出的地方执行以下操作:

=SUBALL(A1,H1:H3,I1:I3)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者我们可以将选项作为字符串放入公式本身中,并使用所需的替换项:

=SUBALL(A1,"Target","MyVal","Walmart","","CVS","Long Receipt Place")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


与所有 UDF 一样,必须遵循一些规则。这些对必须具有相同数量的参数。你不能这样做:

=SUBALL(A1,H1:H3,"Word")
Run Code Online (Sandbox Code Playgroud)

它会失败。但:

=SUBALL(A1,H1:H3,{"Word";"Word";"Word"})
Run Code Online (Sandbox Code Playgroud)

将工作。

在此输入图像描述


使用 SCAN 和 LAMBDA:

=LET(rpl,H1:H3,str,A1,INDEX(SCAN(str,rpl,LAMBDA(a,b,SUBSTITUTE(a,b,""))),COUNTA(rpl)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果我们想用其他单词替换单词,我们可以使用:

=LET(orig,H1:H3,rpl,I1:I3,str,A1,cnt,COUNTA(rpl),INDEX(SCAN(str,SEQUENCE(cnt),LAMBDA(a,b,SUBSTITUTE(a,INDEX(orig,b),INDEX(rpl,b)))),COUNTA(rpl)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述