我有一个公式必须用来从另一个单元格中删除某些字符。例如,单元格C8
可能包含以下内容:A/CB.PR.01-AB
目前,我使用以下公式:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(C8,"/",""),".",""),"-","")," ","")
结果将是ACBPR01AB
。一切都很好,但是我永远都不会忘记上面的公式,而必须继续寻找并复制过来。我以为我可以创建一个VBA函数来运行此公式,而无需全部输入。例如,代替上面的内容,我可以只键入=WBSReplace(C8)
,结果将与输入完整的公式。
我还希望能够在任何工作簿上运行该功能,而不仅限于我所在的工作簿。
答案 0 :(得分:3)
这是ParamArray类型参数争论的理想情况。这样就可以删除几乎无限数量的字符或文本字符串,而无需传入数组。
Function getRidOf(str As String, ParamArray dels())
Dim i As Long
For i = LBound(dels) To UBound(dels)
str = Replace(str, dels(i), vbNullString, 1, -1, vbTextCompare)
Next i
getRidOf = str
End Function
示例:
=getRidOf(C8, "/",".","-"," ") 'result: ACBPR01AB
请注意,vbTextCompare使替换不区分大小写。对于区分大小写的替换,请使用vbBinaryCompare。
此示例对于一长串的删除字符可能更易于使用,因为它会简单地删除任何不是大写字母或数字的内容。删除“特殊”或Unicode字符应该特别有用。
Function getRidOf2(str As String)
Static rgx As Object
If rgx Is Nothing Then
Set rgx = CreateObject("VBScript.RegExp")
End If
With rgx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "[^A-Z0-9]"
If .test(str) Then
str = .Replace(str, vbNullString)
End If
End With
getRidOf2 = str
End Function
示例:
=getRidOf2(C8) 'result: ACBPR01AB
Putting it into Practice with the Selection Object
将此子过程放入公共模块代码表中之后,选择一个或多个单元格,整列,整行或整个工作表,然后通过Alt + F8运行此子过程或将其分配给热键组合。 / p>
sub stripThis()
dim rng as range
for each rng in intersect(selection, selection.parent.usedrange)
rng = getRidOf2(rng.value2)
'or the other one
'rng = getRidOf(rng.value2, "/",".","-"," ")
next rng
end sub
答案 1 :(得分:1)
您可以创建一个用户定义的功能-查看This Link以获得有关如何创建UDF的基础知识,但是基本上,打开VBA代码编辑,插入一个模块,然后粘贴到以下-它应该可以工作,您可以尝试解释代码(很容易理解它的作用)
Function WBSReplace(x As String) As String
x = Replace(x, "/", "")
x = Replace(x, "-", "")
x = Replace(x, ".", "")
x = Replace(x, " ", "")
WBSReplace = x
End Function
答案 2 :(得分:1)
您可以将所有内容放到VBA中,但它不会更漂亮,更简单或易于重用。问题在于,VBA代码已绑定到一个工作簿,如果您想重复使用VBA代码,则要么必须将其复制粘贴,要么必须编写复杂的复制粘贴逻辑来为您完成此工作。无论如何,您的生活可能会比现在困难。但是既然您要了,这里是它的VBA代码:
Public Function WBSReplace(rng As Range) As String
WBSReplace = Replace(Replace(Replace(Replace(rng.Value, "/", ""), ".", ""), "-", ""), " ", "")
End Function
在VBA编辑器中,单击“插入”->“新模块”,然后粘贴该代码。然后,您将能够像在问题中提到的那样使用功能WBSReplace
,但是,正如之前所说,您必须将VBA代码复制粘贴到要使用的每个工作簿中。