使用替代的公式的自定义函数

时间:2018-07-03 21:58:29

标签: excel vba excel-vba

我有一个公式必须用来从另一个单元格中删除某些字符。例如,单元格C8可能包含以下内容:A/CB.PR.01-AB 目前,我使用以下公式:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(C8,"/",""),".",""),"-","")," ","")

结果将是ACBPR01AB。一切都很好,但是我永远都不会忘记上面的公式,而必须继续寻找并复制过来。我以为我可以创建一个VBA函数来运行此公式,而无需全部输入。例如,代替上面的内容,我可以只键入=WBSReplace(C8),结果将与输入完整的公式。

我还希望能够在任何工作簿上运行该功能,而不仅限于我所在的工作簿。

3 个答案:

答案 0 :(得分:3)

Example 1: ParamArray

这是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。

Example 2: RegEx.Replace

此示例对于一长串的删除字符可能更易于使用,因为它会简单地删除任何不是大写字母或数字的内容。删除“特殊”或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代码复制粘贴到要使用的每个工作簿中。