我找到了解决这个问题的方法 - 但是我很难想象没有比我更简单的解决方案。
让我们假设在A栏中,我的单元格中包含以下单词......
A1: Until
A2: I
A3: The
A4: Have
在单元格B1中,我有这句话:
"Until further notice, I have closed the Icecream store"
在单元格C1中,我希望它返回:
"Further Notice, Closed Icecream Store"
目前,我一直在反复使用= SUBSTITUTE()函数:
=PROPER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B1, $A$1, ""), $A$2, ""),$A$3, ""), $A$4, ""))
然而,使用该公式,“Icecream”中的“I”将被删除,并且公式本身必须变得非常长,以便容纳A列中的数百个单元格。
我发现同样笨重的另一个选择是在单元格B1上使用= SPLIT()函数将字符串的每个单词分隔到它自己的单元格(单元格C1:Z1),然后使用:
=IF(ISNUMBER(SEARCH(C1,$A$1:$A,1)),"",C1)
=IF(ISNUMBER(SEARCH(D1,$A$1:$A,1)),"",D1)
等...
在单元格AA1:AZ1中删除不需要的单词。最后在Cell BA1中,a = CONCATENATE()公式将所有单元格放回到所需的字符串中。这个公式也会出现“Icecream”中“I”的问题,所以我找到的唯一解决方法是在A列的每个单词前后放置空格,并在B1中的字符串前后添加空格。
我很好奇是否有更好的方法来解决这个问题,既不需要写一篇文章长公式,也不需要使用数千个单元格和公式来分隔每个单词并单独检查。
谢谢!
泰勒
答案 0 :(得分:0)
考虑以下 UDF():
Public Function NoJunk(r1 As Range, r2 As Range) As String
Dim ary(), r As Range
temp = " " & r1.Text & " "
ReDim ary(1 To r2.Count)
i = 1
For Each r In r2
ary(i) = " " & r.Text & " "
i = i + 1
Next r
For i = 1 To r2.Count
temp = Replace(temp, ary(i), " ")
Next i
NoJunk = Application.WorksheetFunction.Trim(temp)
End Function
例如:
由于比较区分大小写,我在 A 列中包含了小写和适当的大小写。
用户定义函数(UDF)非常易于安装和使用:
如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
删除UDF:
从Excel使用UDF:
=nojunk(B1,A1:A8)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关UDF的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
Macros must be enabled for this to work!
答案 1 :(得分:0)
使用Google表格REGEXREPLACE
和JOIN
函数,示例正则表达式可以是:
(?i)\b(Until|I|Have|The)\b
其中(?i)
是忽略大小写标记,\b
是字边界,()
是捕获组。
=PROPER(TRIM(REGEXREPLACE(B1, "(?i)\b(" & JOIN("|", A1:A4) & ")\b", "")))
Trim
函数还会删除单词之间的额外空格。
Excel 2016具有TextJoin
函数,但还没有RegEx函数(可以使用VBA UDF)。
Microsoft Word具有相似但有限的模式匹配using wildcards,但加入Word中的模式将极具挑战性。示例通配符替换Word中的模式:<(Until|I|Have|The)>
答案 2 :(得分:0)
如果它少于大约10个左右的唯一单词,你知道要删除的是什么,你可以只复制列,Ctrl + H和查找/替换该单词,然后重复,直到你将它们全部删除