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 で取得されます
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 に答える