urd*_*boy 5 excel excel-formula
有没有办法一次交换多个字符串实例而不嵌套?
例如,假设我想从字符串中删除以下值的所有实例:
输入字符串: “我去了 Target 而不是沃尔玛,但我真的想去 CVS”
输出字符串: “我去了而不是但我真的想去”
我尝试了输入=SUBSTITUTE(A1,H1:H3,"")在哪里以及要替换的字符串,但这仅交换第一个字符串A1H1:H3
我知道如何在 VBA 中执行此操作,但该项目无法使用 VBA
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)
现在,您可以向不需要的字符串范围添加任意数量的值,而无需进一步调整公式。
TEXTJOIN()工作。对于 Excel 2019,您还需要通过 进行确认CtrlShiftEnter。FILTERXML()区分大小写。在嵌套之外使用 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)