【问题标题】:Filter column values (different) one by one using Excel VBA使用 Excel VBA 逐一过滤列值(不同)
【发布时间】:2015-03-16 18:14:43
【问题描述】:

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

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

【问题讨论】:

  • 您能否展示您当前拥有的代码并进一步解释您遇到的确切问题?
  • 嵌套数组和字典对象都是独立的。唯一的 With ... End With 块引用整个工作表。 For ... Next 循环可以分配独立的变量以用作计数器。
  • 我找到了一种将字段 3 的所有值复制到不同工作表并删除重复项的方法。然后我有 8-9 个值。但是我如何以及在哪里可以在当前程序中输入这些。谢谢。

标签: excel filter vba


【解决方案1】:

将您的 .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 循环使用第一个等级的下限和上限作为处理限制。每组依次应用,我用一个显示自动过滤范围、过滤字段和过滤条件的 msgbox 暂停了。在“处理”之后,该字段的自动过滤器被清除,为序列中的下一个做准备。

附录:

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

【讨论】:

  • 太棒了..!效果很好。但是,如果字段 7 中的 Criteria 值不时更改,或者我们必须逐个过滤所有值,该怎么办。谢谢..!!
  • @McGill - 脚本字典对象将是从第 7 列收集一组唯一值的最佳方法。嵌套变量数组最适合预设标准。
  • 我现在要做的是:通过宏将唯一值复制到不同的工作表上,然后将范围分配给变量。然后,该变量将在 vCRITs 标准中从 Array(7,"") 获得调用。代码如下:
  • Sub Multi_Filter() Dim v As Long, vCRITs As Variant Dim po As Range Set po = Sheet1.Range("A2:A4") vCRITs = Array(Array(11, "
  • .AutoFilter Field:=vCRITs(v)(0) Next v .AutoFilter End With End Sub
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2019-12-27
  • 2018-10-14
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多