【问题标题】:Removing a number sequence from product name?从产品名称中删除数字序列?
【发布时间】:2018-06-01 02:13:47
【问题描述】:

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

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 之后,但是还有其他集合名称。这只是我正在处理的事情的快照。我已经尝试了所有方法并询问了所有人,但没有人可以提供帮助。

【问题讨论】:

  • 使用Split函数将其用空格分隔,然后检查第二个元素是否有数字首字母,然后重新组合字符串,省略第二个元素。
  • 您要删除的部分的长度是否始终相同并始终由空格“”分隔并且始终位于同一个位置?您能否展示一下您所做的一些尝试?

标签: vba excel


【解决方案1】:

这是相当高级的,但是使用正则表达式更强大。定义要删除数字的范围。它可以是一个单元格或多个单元格=一次范围。你需要在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

结果:

编辑 1:

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

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

结果:

【讨论】:

  • Call 关键字已过时,至少已有 20 年了。
  • 我知道没有它也可以工作,但这只是我学到的,我能说的最低限度是我遇到过没有call的情况下子无法工作的情况。另外,call 对我来说表明 sub 是 sub 而不是函数,它是用户定义的方法。还有一些其他用途,例如调用一个类一次,call 将有助于在一行上执行此操作,或者在转换为 VB.NET 等时将有助于转换
  • 我很乐意看到没有Call 的子程序无法正常工作——我知道“证明”Call 关键字的单个用例涉及指令分隔符:甚至一开始就不应该在那里,使第一个(无参数)方法调用被解释为行标签。 FWIW 编写正确的 OOP 代码将比使用关键字在 VBA7 之前的 3 个版本中弃用的关键字更有助于促进 .NET 转换。
  • 好吧,我不会想尽办法找到没有 call 关键字的情况下无法正常工作的案例,但是搜索 SO,你会看到人们如何提到使用 @987654339 的示例@ 很有用。
  • This 就是您要查找的情况。
【解决方案2】:

如果你知道如何使用 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)

【讨论】:

    【解决方案3】:

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

    一种简单的方法可能是简单地将每个数字替换为数字 3:

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

    【讨论】:

    • 那对Adrienne 4130C Brown/Orange Floral Area Rug有什么影响?
    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多