2

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

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

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

4

2 回答 2

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

快照

在此处输入图像描述

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

于 2012-04-26T15:15:23.730 回答
0

看下面的逻辑

  1. 它首先会在 Activesheet 中找到过滤器的计数。
  2. 如果在特定列中应用过滤器,它将计算在相应列中应用了多少条件
  3. 根据 Count ,在变量 crtnme 中检索 Criteria 名称
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
于 2014-06-02T08:39:44.947 回答