본문 바로가기
Worksheet object

Filter 개체

2023. 9. 11.

Filter object

단일 열에 대한 필터를 나타냅니다.

 

비고

Filter 개체는 Filters 컬렉션의 구성원입니다.Filters 컬렉션에는 자동 필터링된 범위의 필터가 모두 들어 있습니다.

 

Filter 개체를 하나만 반환하려면 Filters(index)를 사용합니다.여기에서 index는 필터 제목이나 인덱스 번호입니다.

Set w = Worksheets("Sales")
If w.AutoFilterMode Then
    filterIsOn = w.autofilter.filters(1).On
Else
End If

Filter 개체의 모든 속성은 읽기 전용입니다. 이러한 속성을 설정하려면 수동으로 자동 필터를 적용하거나 Range 개체의 AutoFilter 메서드를 사용하여 자동 필터를 적용합니다.

 

[Range 개체] AutoFilter Method - 자동필터

AutoFilter Method 자동 필터를 사용하여 목록을 필터링합니다. 구문은 다음과 같습니다. Syntax expression.AutoFilter (Field, Criteria1, Operator, Criteria2, VisibleDropDown, SubField) Field 필터의 기준이 될 필드의 정수

vbaplayground.tistory.com

속성

Count property

컬렉션에 있는 개체 수를 반환하며 읽기 전용인 Long입니다.

 

Syntax
expression.Count

 

expression : Filter 개체를 나타내는 변수입니다.

다음 코드는 필터링이 되어 있는 경우 필드명,필터 기준 ,필터 개수를 출력합니다.

Sub CountFilteredItemsInColumns()
    Dim ws As Worksheet
    Dim filterRange As Range
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("Sales")
    Set filterRange = ws.AutoFilter.Range

    If Not ws.AutoFilterMode Then
        MsgBox "No filters applied in the worksheet."
        Exit Sub
    End If

    For i = 1 To filterRange.Columns.Count
        If ws.AutoFilter.Filters(i).On Then
            PrintFilteredColumnInfo ws, filterRange, i
        End If
    Next i
End Sub

Sub PrintFilteredColumnInfo(ws As Worksheet, filterRange As Range, columnIndex As Long)
    Dim criteria As Variant
    Debug.Print "------------------------"
    Debug.Print "Filtered Field: " & filterRange.Cells(1, columnIndex).Value
    Debug.Print "Number of filtered items: " & ws.AutoFilter.Filters(columnIndex).Count
    criteria = ws.AutoFilter.Filters(columnIndex).Criteria1
    If IsArray(criteria) Then
        Debug.Print "Filter Criteria: " & Join(criteria, ", ")
    Else
        Debug.Print "Filter Criteria: " & criteria
    End If
End Sub

' Output
' ------------------------
' filtered Field: SubCategory
' Number of filtered items: 3
' Filter Criteria: =Bib-Shorts, =Bike Racks, =Bottom Brackets
' ------------------------
' filtered Field: Model
' Number of filtered items: 3
' Filter Criteria: =Hitch Rack - 4-Bike, =HL Bottom Bracket, =LL Bottom Bracket

Criteria1 property

필터링된 범위에서 지정한 열의 첫 번째 필터링된 값을 반환합니다. 읽기 전용인 Variant입니다.

 

Syntax
expression.Criteria1

 

expression : Filter 개체를 나타내는 변수입니다.

 

다음 코드는 시트 이름과 필드 번호를 매개변수로 받아서 필터링된 조건을 출력합니다.

Sub GetFilterCriteria(wsName As String, field As Integer)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(wsName)
    
    If ws.AutoFilterMode Then
        With ws.AutoFilter.Filters(field)
            If .On Then
                ' Check if Criteria1 is an array
                If IsArray(.Criteria1) Then
                    Dim i As Integer
                    
                    ' Print all criteria in the array
                    For i = LBound(.Criteria1) To UBound(.Criteria1)
                        Debug.Print .Criteria1(i)
                    Next i
                Else
                    ' Print single value criteria
                    Debug.Print .Criteria1
                End If
                
            End If
        End With
    End If
    
End Sub

Sub Test()
    Call GetFilterCriteria("Sales", 3)
End Sub

' Output
' =AWC Logo Cap
' =Cable Lock
' =Chain
' =Classic Vest, L

Criteria2 property

필터링된 범위에서 지정한 열에 대한 두 번째 필터링된 값을 반환합니다. 읽기 전용인 Variant입니다.

 

Syntax
expression.Criteria2

 

expression : Filter 개체를 나타내는 변수입니다.

 

비고
두 가지 기준을 사용하지 않는 필터의 Criteria2 속성에 액세스하려고 하면 오류가 발생합니다. Criteria2 속성에 액세스하기 전에 Filter 개체의 Operator 속성이 0이 아닌지 확인합니다.

 

다음 코드는 필터 상태에 따른 메시지를 출력합니다.

Sub GetFilterCriteria2(wsName As String, field As Integer)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(wsName)

    If Not ws.AutoFilterMode Then
        MsgBox "워크시트에 자동필터가 적용되지 않았습니다."
        Exit Sub
    End If

    With ws.AutoFilter.Filters(field)
        If Not .On Then
            MsgBox "필드에 필터링이 적용되지 않았습니다."
            Exit Sub
        Else

            Select Case .Operator
            Case 0, 7
                MsgBox "Criteria2는 AND/OR 연산을 사용합니다."
            Case 1, 2
                MsgBox .Criteria2
            Case Else
                MsgBox "필터에서 다른 연산이 사용되었습니다."
            End Select
        End If
    End With

End Sub

Sub Test()
    Call GetFilterCriteria2("Sales", 3)
End Sub

On property

True이면 지정한 필터가 사용 중입니다. 읽기 전용인 Boolean입니다.

 

Syntax
expression.On

 

expression : Filter 개체를 나타내는 변수입니다.

 

다음 코드는 필터가 사용되는지 확인하는 간단한 코드입니다.

Sub CheckFilter()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sales")
    
    If ws.AutoFilterMode Then ' 자동필터 모드 확인
        With ws.AutoFilter.Filters(1) ' 첫 번째 열의 필터 확인
            If .On Then
                MsgBox "첫 번째 열에 필터가 적용되었습니다."
            Else
                MsgBox "첫 번째 열에 필터가 적용되지 않았습니다."
            End If
        End With
    Else
        MsgBox "워크시트에 자동필터가 없습니다."
    End If
    
End Sub

 

다음 코드는 필터된 상태에 따라 상황에 맞는 메시지를 출력합니다.

Function GetFilterCriteria(ws As Worksheet, fieldNum As Integer) As String
    Dim c1 As Variant    ' Criteria1 값을 저장할 변수
    Dim c2 As Variant    ' Criteria2 값을 저장할 변수

    If ws.AutoFilterMode Then
        With ws.autofilter.filters(fieldNum)
            If .On Then
                ' 첫 번째 열의 filter criteria 값을 c1에 저장
                c1 = .Criteria1

                ' AND나 OR 연산자가 사용된 경우 Criteria2도 확인
                If .operator = 1 Or .operator = 2 Then
                    c2 = .Criteria2
                End If

            Else
                GetFilterCriteria = "필터된 상태가 아닙니다."
                Exit Function
            End If

        End With
    Else
        GetFilterCriteria = "자동 필터 모드가 아닙니다."
        Exit Function
    End If

    ' 결과 반환 (배열 형태)
    If IsArray(c1) Then
        GetFilterCriteria = Join(c1, ", ")
    Else
        GetFilterCriteria = c1 & IIf(IsEmpty(c2), "", ", " & c2)
    End If

End Function

Sub DisplayFilterCriteria()

    Dim criteria As String

    ' 원하는 워크시트 이름과 필드 번호로 변경
    criteria = GetFilterCriteria(Worksheets("Sales"), 2)

    MsgBox criteria

End Sub

Operator property

지정한 필터에 의해 적용되는 두 가지 조건과 연관된 연산자를 나타내는 XlAutoFilterOperator 값을 반환합니다.

 

 

XlAutoFilterOperator enumeration (Excel)

Office VBA reference topic

learn.microsoft.com

Syntax
expression.Operator

 

expression : Filter  개체를 나타내는 변수입니다.

 

다음 코드는 필터 상태에 따라 값을 출력합니다.

Function RetrieveFilterOperator(ws As Worksheet, fieldNum As Integer) As Variant
    Dim op
    If ws.AutoFilterMode Then
        With ws.autofilter.filters(fieldNum)
            If .On Then

                op = .operator

            Else
                RetrieveFilterOperator = "필터된 상태가 아닙니다."
                Exit Function
            End If

        End With
    Else
        RetrieveFilterOperator = "자동 필터 모드가 아닙니다."
        Exit Function
    End If

    RetrieveFilterOperator = op

End Function

Sub DisplayFilterCriteria()

    Dim criteria As Variant

    criteria = RetrieveFilterOperator(Worksheets("Sales"), 1)

    MsgBox criteria

End Sub

 

관련 글

 

AutoFilter object

Worksheet.AutoFilter 속성

Worksheet.AutoFilterMode 속성

Worksheet.FilterMode 속성

Filters 개체

AutoFilter 메서드

'Worksheet object' 카테고리의 다른 글

Worksheet.Visible 속성  (0) 2024.02.20
Filters 개체  (0) 2023.09.10
AutoFilter object  (0) 2023.09.08
Worksheet.FilterMode 속성  (0) 2023.09.08
Worksheet.AutoFilterMode 속성  (0) 2023.09.08