【问题标题】:VBA: Loop through criteria in an inactive excel filter?VBA:在非活动的excel过滤器中循环标准?
【发布时间】:2012-05-07 07:25:14
【问题描述】:

我正在寻找一种方法来循环遍历没有过滤掉任何内容的 excel 过滤器的标准(即所有标准都已启用)。当过滤器处于活动状态时,所有条件都将添加到数组类型的事物中,可以通过以下方式访问:

for each criteria in ActiveSheet.AutoFilter.Filters(filterColumn).Criteria1

但是,当过滤器未激活时,Criteria1 和 Criteria2 方法给我一个错误并且似乎没有返回任何内容。没有办法遍历所有条件似乎很愚蠢,但到目前为止我还没有找到它。

【问题讨论】:

  • 你能不能只是 activecell.value ="" 然后去下一个单元格??
  • @superadamwo 这与获取特定列中的唯一值不一样吗(这是一个微不足道的问题)?

标签: vba filter criteria


【解决方案1】:

当您有 1 或 2 个条件选择时,您可以像这样简单地检索它们

Option Explicit

Sub sample()
    Dim rRange As Range
    Dim iFiltCrit As Long

    'Remove any filters
    ActiveSheet.AutoFilterMode = False

    Set rRange = Range("A1:B8")

    With rRange
        .AutoFilter Field:=1, Criteria1:="=1"

        Debug.Print Sheet1.AutoFilter.Filters(1).Criteria1
    End With

    'Remove any filters
    ActiveSheet.AutoFilterMode = False
End Sub

当您有超过 2 个条件时,您可以按照您提到的那样循环,因为它们存储在一个数组中。

问题是当过滤器处于非活动状态时,即您可以看到所有内容,然后从内存中清除所有条件。请参阅此示例。我正在使用ActiveSheet.ShowAllData 来显示所有数据。

Option Explicit

Sub sample()
    Dim rRange As Range

    'Remove any filters
    ActiveSheet.AutoFilterMode = False

    Set rRange = Range("A1:B8")

    With rRange
        .AutoFilter Field:=1, Criteria1:="=1"

        Debug.Print ">"; Sheet1.AutoFilter.Filters(1).Criteria1

        '~~> Show all data
        ActiveSheet.ShowAllData

        Debug.Print ">>"; Sheet1.AutoFilter.Filters(1).Criteria1
    End With

    'Remove any filters
    ActiveSheet.AutoFilterMode = False

End Sub

快照

所以我相信,一旦显示所有数据,您将无法再检索该信息。

【讨论】:

    【解决方案2】:

    看下面的逻辑

    1. 它将首先在 Activesheet 中找到过滤器计数。
    2. 如果在特定列中应用过滤器,它将计算在相应列中应用了多少条件
    3. 根据 Count ,在变量 crtnme 中检索条件名称
    Set Sht = ActiveSheet
     With Sht.AutoFilter
      For i = 1 To .Filters.Count
         If .Filters(i).On Then
           Sheets("Filter").Cells(j, 1).Value = .Range(6, i).Column 'header starts from 6th row
           A = .Filters(i).Count
           If A = 1 Then
            crtnme = .Filters(i).Criteria1
            msgbox(crtnme)
           ElseIf A = 2 Then
            crtnme  = .Filters(i).Criteria1
            crtnme  = crtnme   & "|" & .Filters(i).Criteria2
            msgbox(crtnme)
           Else
            For k = 1 To A
             crtnme  = crtnme  & "|" & .Filters(i).Criteria1(k)
            Next
            msgbox(crtnme)
           End If
        End If
      Next i
      End With
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多