使用 Excel VBA 一一过滤列值(不同)

Filter column values (different) one by one using Excel VBA

我正在尝试逐一过滤列的值。过滤后的值每次都不同。有没有办法让宏可以捕捉到这一点。

Sub Macro1()
    Sheets("Open").Select
    'invoice value less than 0
    ActiveSheet.Range("$A:$R00").AutoFilter Field:=11, Criteria1:="<0", _
        Operator:=xlAnd
    'Selected Country
    ActiveSheet.Range("$A:$R00").AutoFilter Field:=3, Criteria1:="ARG"
    'Selected invoice#
    ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1007225"
    Range("G528").Select
    ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1015678"
    ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1018523"
    Range("G1").Select
    ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1018962"
End Sub

将您的 .AutoFilter 字段填充到嵌套变量数组中,并使用 rankLBoundUBound 查看集合。

Sub a1Multi_Filter()
    Dim v As Long, vCRITs As Variant
    Dim vKey As Variant, dCOL7s As New Scripting.Dictionary

    dCOL7s.CompareMode = BinaryCompare

    vCRITs = Array(Array(11, "<0"), _
                   Array(3, "ARG"), _
                   Array(7, "1007225"), _
                   Array(7, "1015678"), _
                   Array(7, "1018523"), _
                   Array(7, "1018962"))

    With ActiveSheet.Cells(1, 1).CurrentRegion
        .AutoFilter
        For v = LBound(vCRITs, 1) To UBound(vCRITs, 1)
            .AutoFilter Field:=vCRITs(v)(0), Criteria1:=vCRITs(v)(1)

            'pause for effect and processing
             MsgBox "array presets" & Chr(10) & "filtered " & .Address(0, 0) & " on column " & Chr(64 + vCRITs(v)(0)) & " for " & vCRITs(v)(1)

            .AutoFilter Field:=vCRITs(v)(0)
        Next v
        .AutoFilter

        For v = 2 To .Rows.Count
            If CBool(Len(.Cells(v, 7).Value)) And Not dCOL7s.Exists(.Cells(v, 7).Value) Then _
                dCOL7s.Add Key:=.Cells(v, 7).Value, Item:=7
        Next v

        For Each vKey In dCOL7s.Keys  'v = 0 To (dCOL7s.Count - 1)
            .AutoFilter Field:=dCOL7s.Item(vKey), Criteria1:=vKey

            'pause for effect and processing
            MsgBox "column 7 special" & Chr(10) & "filtered " & .Address(0, 0) & " on column " & Chr(64 + dCOL7s.Item(vKey)) & " for " & vKey

            .AutoFilter Field:=dCOL7s.Item(vKey)
        Next vKey
    End With
    dCOL7s.RemoveAll: Set dCOL7s = Nothing
End Sub

我给你留下了足够的处理空间,消息文本应该有助于解释变量数组的元素。

在设置字段索引和条件参数对后,For ... Next 循环使用第一个等级的下限和上限作为处理的限制。每组依次应用,我暂停了一个显示自动筛选范围、筛选字段和筛选条件的消息框。在 'processing' 之后,该字段的自动过滤器被清除以准备序列中的下一个字段。

附录:

我已将 G 列中的唯一项集合添加到脚本字典中,然后循环遍历字典键和项,将每一对用作同一个 .AutoFilter 中的过滤器和条件。要使用脚本字典,您需要进入 VBE 的工具 ► 参考并将 Microsoft Scripting Runtime 添加到项目中。这只需要添加一次;并非适用于这可能 运行 的每台计算机,但如果开始使用脚本字典的新项目,则也必须将其添加到该项目中。