vba - 设置自动过滤多个通配符

标签 vba excel dictionary autofilter

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

(从左边开始是A列) 名称 * B设备 * 数量 * 销售* 所有者

基本上我需要过滤掉两列: - 任何单词包含“M1454”或“M1467”或“M1879”的BDevice(这意味着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

当我运行代码时,机器返回错误1004,看起来错误的部分是Filter第2部分(我不确定Field的使用,所以不能确定)

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

最佳答案

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

第二个字段是简单的 Criteria1 和 Criteria2 直接匹配,并通过 Operator:=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

如果要将排除项 1 添加到过滤中,则应将其逻辑放置在 Select..End Select 语句的顶部,以免误报将其添加到其他匹配条件。

         multi_Wildcard_Filter_Before
                        应用自动过滤方法之前

         multi_Wildcard_Filter_After
                        使用多个通配符应用自动筛选后

<小时/>

1 参见 Can Advanced Filter criteria be in the VBA rather than a range?Can AutoFilter take both inclusive and non-inclusive wildcards from Dictionary keys?有关向字典的过滤器集添加排除项的更多信息。

关于vba - 设置自动过滤多个通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16602872/

相关文章:

excel - 字典、集合和数组的比较

vba - Excel 中的宏中的 If 语句

javascript - 如何使用正确的纬度/经度格式将 html 表导出到 excel?

vba - 从单元格中的列表中删除多个单词

excel - 使用宏格式化 Excel 中的单元格小数位

excel - 从变量表中复制数据

excel - 根据条件删除整行无法处理 400,000 行

在字典中设置值的pythonic方式

c++ - 如何比较两个 union 的排序

python - 从字典列表中删除具有近乎重复值的字典 - Python