带子字符串的Excel VBA自动过滤器

时间:2017-10-26 18:03:57

标签: regex excel vba substring

我的Excel中有多行,D列为:TDM-02 Bundle Rehoming 5 NE,TDM-02 Bundle Rehoming 23 NE,IP-02 Bundle Rehoming 7 NE等。请注意NE的数量不同于大多数地方。 我想在Excel VBA中搜索子字符串以自动过滤:

sht2.Select
    sht2.Activate
    If sht2.FilterMode Then
        sht2.ShowAllData
    End If

    sht2.Range("D1:D" & LastRow).AutoFilter Field:=4, Criteria1:=Array( _
        CStr("HYBRID ATM and IP - 02 Bundle Rehoming" & Chr(42)), _
        CStr("TDM - 02 Bundle Rehoming" & Chr(42)), _
        CStr("IP - 02 Bundle Rehoming" & Chr(42))), Operator:=xlFilterValues

然而,这不会产生任何结果。没有生成错误,但结果是空行 我尝试了各种其他选项,例如" HYBRID ATM和IP-02 Bundle Rehoming **"等但没有任何成功。 有没有办法自动过滤这些带有变量结尾的子串。

2 个答案:

答案 0 :(得分:1)

正则表达式

正则表达式\d+(?=\s*NE)

Regex101

D列上的值代码并在E列上写入数字,因此您可以过滤E列:

Dim str As String
Dim objMatches As Object
lastrow = Cells(Rows.Count, "D").End(xlUp).Row
For i = 1 To lastrow
    str = Cells(i, "D")
    Set objRegExp = CreateObject("VBScript.RegExp") 'New regexp
    objRegExp.Pattern = "\d+(?=\s*NE)"
    objRegExp.Global = True
    Set objMatches = objRegExp.Execute(str)
    If objMatches.Count > 0 Then
        For Each m In objMatches
            Cells(i, "E") = m.Value
        Next
    End If
Next i
  

请记住enable the reference

结果

Result

编辑:

我误解了它,所以这里是Regex101和代码

的评论
Dim str As String
Dim objMatches As Object
lastrow = Cells(Rows.Count, "D").End(xlUp).Row
For i = 1 To lastrow
    str = Cells(i, "D")
    Set objRegExp = CreateObject("VBScript.RegExp") 'New regexp
    objRegExp.Pattern = "\d+(?=\s*NE)"
    objRegExp.Global = True
    Set objMatches = objRegExp.Execute(str)
    If objMatches.Count > 0 Then
    k = 5
        For Each m In objMatches
           Cells(i, k) = m.Value
           k = k + 1
        Next
    End If
Next i

结果

Result Edit

因此,您只需为数字过滤其他列。

答案 1 :(得分:0)

您可以提供“正则表达式”或显式值数组,但不能提供“正则表达式”数组。您可以做的是创建一个循环,找到您要查找的所有值,并将它们作为数组提供。