VBA:在非活动的Excel过滤器中循环标准?

时间:2012-04-26 14:27:58

标签: vba filter criteria

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

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

但是,当未激活过滤器时,Criteria1和Criteria2方法会给我一个错误,似乎没有返回任何内容。愚蠢的是,没有办法绕过所有标准,但到目前为止我还没有找到它。

2 个答案:

答案 0 :(得分: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

快照

enter image description here

因此,我相信一旦您显示所有数据,就无法再检索到该信息。

答案 1 :(得分:0)

见以下逻辑

  1. 首先会在Activesheet中找到过滤器数。
  2. 如果在特定列中应用过滤器,则会计算在相应列中应用的标准数
  3. 根据Count,Criteria名称将在变量crtnme
  4. 中重试
    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