设置自动筛选多个通配符

Tho*_*mas 8 excel vba dictionary autofilter excel-vba

现在我正在编码为数据图表设置过滤器.基本上,我不知道如何在这里发布数据表,所以只需尝试输入它们:

(从左边开始是A栏)名称*BDevice*数量*销售*所有者

基本上我需要过滤2列: - 任何单词的BDevice包含"M1454"或"M1467"或"M1879"(这意味着M1454A或M1467TR仍然适用) - 拥有PROD或RISK的所有者

这是我写的代码:

Sub AutoFilter()

  ActiveWorkbook.ActiveSheet..Range(B:B).Select

  Selection.Autofilter Field:=1 Criteria1:=Array( _
      "*M1454*", "*M1467*", "*M1879*"), Operator:=xlFilterValues

  Selection.AutoFilter Field:=4 Criteria1:="=PROD" _
      , Operator:=xlOr, Criteria2:="=RISK"

End Sub
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,机器返回错误1004并且看起来错误的部分是过滤器部分2(我不确定使用Field,所以我不能肯定地说)

编辑; Santosh:当我尝试你的代码时,机器得到错误9下标超出范围.错误来自with语句.(因为数据表有A到AS列,所以我只改为A:AS)

小智 7

虽然AutoFilter方法中每个字段最多有两个直接通配符,但模式匹配可用于创建一个数组,该数组使用Operator:= xlFilterValues选项替换通配符.一个Select Case语句帮助通配符匹配.

第二个字段是简单的Criteria1和Criteria2直接匹配运算符:= xlOr加入两个标准.

Sub multiWildcardFilter()
    Dim a As Long, aARRs As Variant, dVALs As Object

    Set dVALs = CreateObject("Scripting.Dictionary")
    dVALs.CompareMode = vbTextCompare

    With Worksheets("Sheet1")
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            'build a dictionary so the keys can be used as the array filter
            aARRs = .Columns(2).Cells.Value2
            For a = LBound(aARRs, 1) + 1 To UBound(aARRs, 1)
                Select Case True
                    Case aARRs(a, 1) Like "MK1454*"
                        dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1)
                    Case aARRs(a, 1) Like "MK1467*"
                        dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1)
                    Case aARRs(a, 1) Like "MK1879*"
                        dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1)
                    Case Else
                        'no match. do nothing
                End Select
            Next a

            'filter on column B if dictionary keys exist
            If CBool(dVALs.Count) Then _
                .AutoFilter Field:=2, Criteria1:=dVALs.keys, _
                                      Operator:=xlFilterValues, VisibleDropDown:=False
            'filter on column E
            .AutoFilter Field:=5, Criteria1:="PROD", Operator:=xlOr, _
                                  Criteria2:="RISK", VisibleDropDown:=False

            'data is filtered on MK1454*, MK1467* or MK1879* (column B)
            'column E is either PROD or RISK
            'Perform work on filtered data here
        End With
        If .AutoFilterMode Then .AutoFilterMode = False
    End With

    dVALs.RemoveAll: Set dVALs = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)

如果要将过滤¹添加到过滤中,则应将它们的逻辑放在Select .. End Select语句的顶部,以便它们不会通过误报添加到其他匹配条件.

        multi_Wildcard_Filter_Before
                        在应用AutoFilter方法之前

        multi_Wildcard_Filter_After
                        应用具有多个通配符的AutoFilter后


¹ 请参阅高级过滤条件是否可以在VBA而不是范围内?并且AutoFilter可以从Dictionary键中获取包含通配符和非包含通配符吗?有关向字典的过滤器集添加排除项的更多信息.


San*_*osh 0

尝试下面的代码:

Criteria1 的最多 2 个通配符表达式有效。参考这个链接

Sub AutoFilter()

    With ThisWorkbook.Sheets("sheet1").Range("A:E")
        .AutoFilter Field:=2, Criteria1:=Array("*M1454*", "*M1467*"), Operator:=xlFilterValues
        .AutoFilter Field:=5, Criteria1:="=PROD", Operator:=xlOr, Criteria2:="=RISK"
    End With

End Sub
Run Code Online (Sandbox Code Playgroud)