Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用excel vba在一列中自动筛选4个标准_Vba_Excel - Fatal编程技术网

使用excel vba在一列中自动筛选4个标准

使用excel vba在一列中自动筛选4个标准,vba,excel,Vba,Excel,我需要在一列中筛选4个条件。使用自动筛选,但不起作用。仅适用于2个条件。 请给出这个问题的解决方案 注:我是Excel Vba的初学者。重新分发数据更容易,但使用自动筛选,您可以通过应用“帮助器”列将4标准减少为1标准 helper列将包含以下公式: =IF(OR(ISNUMBER(FIND("Number",A2)),ISNUMBER(FIND("Name",A2)),ISNUMBER(FIND("Street",A2)),ISNUMBER(FIND("Address",A2))),"Dis

我需要在一列中筛选4个条件。使用自动筛选,但不起作用。仅适用于2个条件。

请给出这个问题的解决方案


注:我是Excel Vba的初学者。

重新分发数据更容易,但使用自动筛选,您可以通过应用“帮助器”列将4标准减少为1标准

helper列将包含以下公式:

=IF(OR(ISNUMBER(FIND("Number",A2)),ISNUMBER(FIND("Name",A2)),ISNUMBER(FIND("Street",A2)),ISNUMBER(FIND("Address",A2))),"Display","Hide")
然后我们可以在“助手”上进行过滤。之前:

守则:

Sub User()
    Dim N As Long, r1 As Range, r2 As Range
    Dim s As String

    N = Cells(Rows.Count, "A").End(xlUp).Row
    Range("B1").Value = "helper"
    Set r1 = Range("B2:B" & N)
    s = "=IF(OR(ISNUMBER(FIND(""Number"",A2)),ISNUMBER(FIND(""Name"",A2)),ISNUMBER(FIND(""Street"",A2)),ISNUMBER(FIND(""Address"",A2))),""Display"",""Hide"")"
    r1.Formula = s

    With Range("A:B")
        .AutoFilter
        .AutoFilter Field:=2, Criteria1:="Display"
    End With
End Sub
及之后:


自动筛选仅限于2个带通配符(*或?)的条件

下面的两个版本允许您根据需要指定任意多的通配符


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



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



我只能建议将您的数据带到standart视图,即表格。
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
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