【问题标题】:AutoFilter based on an array, more than 3 elementsAutoFilter 基于数组,超过 3 个元素
【发布时间】:2018-04-19 03:55:44
【问题描述】:

编辑:我的变量包含通配符。我在网上看到说如果我使用通配符,自动过滤器只能包含两个条件。这是真的?如果是这样,这可能是我的问题。不幸的。 结束编辑

我正在尝试过滤我的数据以显示数据是否包含数组中的六个项目之一。元素是字符串变量。我的工作代码是:

With ActiveSheet
    .Columns("J").AutoFilter Field:=1, Criteria1:=Array(d3, d2), _
     Operator:=xlFilterValues
End With

这背后的想法适用于我希望完成的事情。但是,我实际上想要数组的 6 个元素,而不仅仅是两个。不幸的是,当我尝试添加所有六个元素时,什么都没有显示。

 With ActiveSheet
    .Columns("J").AutoFilter Field:=1, Criteria1:=Array(d3, d2, d1, d21, d11, d31), Operator:=xlFilterValues
End With

我没有收到错误或任何东西。只是什么都没有出现。有谁知道如何解决这个问题? 我已经用数组中的两个元素和字符串的各种组合(d1、d21 等)测试了代码,它们都按预期工作,所以问题不在于变量。

【问题讨论】:

    标签: excel filter vba


    【解决方案1】:

    AutoFilter 仅限于 2 个带有通配符(* 或 ?)的条件

    以下 2 个版本将允许您根据需要指定任意数量的通配符


    .

    版本 1 - 循环遍历每个通配符,应用 AutoFliter 并组合可见范围


    Option Explicit
    
    Public Sub FilterRows3WildAF()      '(Optional ByVal showAll As Boolean = False)
    
        Const FILTER_COL = "A"
        Const WILDCARDS = "Name Street Address Number"  'cell starts with these 4 words
    
        Dim ws As Worksheet, wild As Variant, lr As Long, toShow As Range, itm As Variant
    
        Set ws = ActiveSheet
        wild = Split(WILDCARDS) 'will search for cells starting with: Name*, then Street*, etc
        Application.ScreenUpdating = False
        ws.Rows.Hidden = False
    
        With ws.Range(ws.Cells(1), ws.Cells(ws.Rows.Count, FILTER_COL).End(xlUp))
            lr = .Rows.Count
            Set toShow = .Cells(lr + 1, FILTER_COL)
            For Each itm In wild
                .AutoFilter Field:=1, Criteria1:=itm & "*", Operator:=xlFilterValues
                If .SpecialCells(xlCellTypeVisible).Cells.CountLarge > 1 Then
                    Set toShow = Union(toShow, .Offset(1).SpecialCells(xlCellTypeVisible))
                End If
            Next
            .AutoFilter
            .Rows.Hidden = True
            toShow.EntireRow.Hidden = False
        End With
        Application.ScreenUpdating = True
    End Sub
    

    .

    版本 2 - 循环遍历每个单元格,使用 InStr() 检查通配符是否存在


    Public Sub FilterRows3WildInstr()   '(Optional ByVal showAll As Boolean = False)
    
        Const FILTER_COL = "A"
        Const WILDCARDS = "Name Street Address Number"  'cell starts with these 4 words
    
        Dim ws As Worksheet, wild As Variant, lr As Long, arr As Variant
        Dim toHide As Range, r As Long, itm As Variant, found As Boolean
    
        Set ws = ActiveSheet
        wild = Split(WILDCARDS) 'will search for cells starting with: Name*, then Street*, etc
        ws.Rows.Hidden = False
    
        With ws.Range(ws.Cells(1), ws.Cells(ws.Rows.Count, FILTER_COL).End(xlUp))
            lr = .Rows.Count
            arr = .Value2
            Set toHide = .Cells(lr + 1, FILTER_COL)
            For r = 1 To UBound(arr)
                For Each itm In wild
                    found = InStr(1, arr(r, 1), itm) > 0
                    If found Then Exit For
                Next
                If Not found Then Set toHide = Union(toHide, .Cells(r, FILTER_COL))
            Next
            toHide.EntireRow.Hidden = True: .Rows(lr + 1).Hidden = False
        End With
    End Sub
    

    【讨论】:

    • 哇,这真的很有趣。感谢您的回复!我从中学到了一些新东西,这是非常理想的,因为我必须自学 VBA。我确定我将来会使用 Union 范围
    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2021-11-08
    • 2010-09-29
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多