从产品名称中删除数字序列?

时间:2017-12-18 17:28:41

标签: excel vba excel-vba

我有地毯名称,我正在尝试删除那些(几乎总是)数字的部分:

Adrienne 3729F Beige/Blue Geometric Area Rug 
Adrienne 3836E Grey/Multi Geometric Area Rug 
Adrienne 3960G Navy/Gray Floral Area Rug 
Adrienne 4130C Brown/Orange Floral Area Rug 
Adrienne 4138A Multi Stripe Area Rug 
Adrienne 4142A Grey/Brown Floral Area Rug 
Adrienne 4145E Green/Plum Oriental Area Rug 

为了澄清,我试图删除的部分是在 Adrienne 之后,但是还有其他集合名称。这只是我正在处理的一个快照。我尝试过每一个人,并且问每个人,没有人可以提供帮助。

3 个答案:

答案 0 :(得分:2)

这是相当高级的,但使用正则表达式更强大。定义要删除数字的范围。它可以是一个细胞或多个细胞=一次范围。你需要在sub Main中定义你的范围,它会照顾到你。例如,我使用range("A1:A3")。如果您的号码在A栏中,则只需使用cells(1,1).CurrentRegion

即可
Sub RegexReplace(rng As Range, ByVal replace_what As String, ByVal replace_with As String)
    Dim RE As Object
    Dim v
    Dim i As Long
    Set RE = CreateObject("vbscript.regexp")
    v = rng.Value2
    RE.Pattern = replace_what
    RE.Global = True
    With RE
        For i = 1 To UBound(v)
            v(i, 1) = .Replace(v(i, 1), replace_with)
        Next
    End With
    rng = v
End Sub

Sub Main()
    Call RegexReplace(Range("A1:A3"), "\d", "")
End Sub

<强>结果:

enter image description here

修改1:

如果您还想删除附加到数字的字符,您可以轻松更改函数中的正则表达式参数并实现它:

Sub Main()
    Call RegexReplace(Range("A1:A7"), "(\d+)[A-Z]", "")
End Sub

<强>结果:

enter image description here

答案 1 :(得分:0)

那些是不同的列还是一个大字符串?

一种简单的方法可能是简单地替换数字3的所有单个数字:

=replace(A1;find("3";A1);1;"")

答案 2 :(得分:0)

如果您知道如何使用RegEx和VBA,这是一个很好的解决方案:

Option Explicit

Public Function RemoveSomeNumbers(s As String) As String

    Dim regEx           As Object
    Dim inputMatches    As Object
    Dim regExString     As String

    Set regEx = CreateObject("VBScript.RegExp")

    With regEx
        'from 3 to 4 digits grouped together:
        .Pattern = "[\d]{3,4}.*$"
        .IgnoreCase = True
        .Global = True

        Set inputMatches = .Execute(s)

        If regEx.test(s) Then
            RemoveSomeNumbers = .Replace(s, vbNullString)
        End If

    End With

End Function

Public Sub TestMe()
    Debug.Print RemoveSomeNumbers("Adrienne 3729F Beige/Blue Geometric Area Rug")
    Debug.Print RemoveSomeNumbers("Adrienne 4142A Grey/Brown Floral Area Rug")
    Debug.Print RemoveSomeNumbers("Vityata 4142A Grey/Brown Floral Area Rug")
End Sub

它会删除句子中前3位或更多位后的任何内容。它比Split()更好,因为产品名称可能包含空格。 如果默认情况下不包含空格,则更简单的解决方案就是Split()并获取第一个结果:

Split("Adrienne 3729F Beige/Blue Geometric Area Rug")(0)