从string中删除:在Excel中出现在列中的所有单词
我已经find了解决这个问题的方法 – 但是我很难想象没有比我更简单的解决scheme。
假设在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()函数将string的每个单词分隔成自己的单元格(单元格C1:Z1),然后使用:
=IF(ISNUMBER(SEARCH(C1,$A$1:$A,1)),"",C1) =IF(ISNUMBER(SEARCH(D1,$A$1:$A,1)),"",D1)
等等…
在单元格AA1:AZ1删除不需要的单词。 然后最后在单元格BA1中使用a = CONCATENATE()公式将所有单元格放回到所需的string中。 这个公式在“Icecream”中也会遇到“I”的问题,所以我find的唯一解决方法是在A列中的每个单词前后放置空格,并在B1中的string之前和之后添加空格。
我很好奇,如果有更好的方法来处理这个问题,不需要写一篇散文长的公式,或者使用数千个单元格和公式来分隔每个单词并单独检查。
谢谢!
泰勒
使用Google表格REGEXREPLACE
和JOIN
函数,示例正则expression式可以是:
(?i)\b(Until|I|Have|The)\b
其中(?i)
是一个忽略情况标志, \b
是词边界, ()
是一个捕获组。
=PROPER(TRIM(REGEXREPLACE(B1, "(?i)\b(" & JOIN("|", A1:A4) & ")\b", "")))
Trim
function还可以删除单词之间的多余空格。 Excel 2016具有TextJoin
函数,但是没有RegEx函数(可以使用VBA UDF)。
Microsoft Word 使用通配符具有类似但有限的模式匹配,但在Word中join模式将会非常具有挑战性。 示例通配符在Word中replace模式: <(Until|I|Have|The)>
考虑下面的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)非常易于安装和使用:
- ALT-F11调出VBE窗口
- ALT-I ALT-M打开一个新的模块
- 粘贴东西,closuresVBE窗口
如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件另存为.xlsm而不是.xlsx
要删除UDF:
- 如上所示调出VBE窗口
- 清除代码
- closuresVBE窗口
从Excel中使用UDF:
=nojunk(B1,A1:A8)
要了解有关macros的更多信息,请参阅:
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!
如果less于10个左右,你知道要删除什么的唯一的单词,你可以复制列Ctrl + H和查找/replace这个单词,并重复,直到你把它们全部删除。