본문 바로가기
Worksheet object

AutoFilter object

2023. 9. 8.

AutoFilter object

지정된 워크시트에 대한 자동 필터링을 나타냅니다.

 

Note

AutoFilter를 날짜와 함께 사용하는 경우 형식은 국가별 설정(".")이 아닌 영어 날짜 구분 기호("/")와 일치해야 합니다. "2/2/2007"은 유효한 날짜 형식이지만 "2.2.2007"은 잘못된 형식입니다.

 

AutoFilter 개체를 반환하려면 AutoFilter 속성을 사용하고 각 열의 필터 집합을 반환하려면 Filters 속성을 사용합니다. 필터링한 범위 전체를 나타내는 Range 개체를 반환하려면 Range 속성을 사용합니다. 다음은 현재 필터링에 대한 필터링 조건과 주소를 저장한 후 새 필터를 적용하는 예제입니다.

Dim w As Worksheet
Dim filterArray()
Dim currentFiltRange As String

Sub ChangeFilters()
    Dim f As Long    ' 정수형 변수 f를 선언합니다.

' "Sales" 워크시트를 w 변수에 할당합니다.
    Set w = Worksheets("Sales")

    ' w 워크시트의 자동 필터를 설정합니다.
    With w.AutoFilter
        ' 현재 자동 필터 범위의 주소를 currentFiltRange 변수에 저장합니다.
        currentFiltRange = .Range.Address

        ' 자동 필터 설정을 조작하기 위해 Filters 컬렉션을 사용합니다.
        With .Filters
            ' filterArray 배열을 동적으로 크기를 조정합니다.
            ReDim filterArray(1 To .Count, 1 To 3)

            ' 자동 필터 설정을 순회하면서 정보를 수집합니다.
            For f = 1 To .Count
                With .Item(f)
                    ' 필터가 활성화되어 있는 경우:
                    If .On Then
                        ' Criteria1 값을 filterArray 배열에 저장합니다.
                        filterArray(f, 1) = .Criteria1

                        ' 연산자가 있는 경우:
                        If .Operator > 0 Then

                            If .Operator <> 7 Then
                                ' Operator 값을 filterArray 배열에 저장합니다.
                                filterArray(f, 2) = .Operator

                                ' Criteria2 값을 filterArray 배열에 저장합니다.
                                filterArray(f, 3) = .Criteria2
                            Else
                            End If
                        Else
                        End If
                    Else
                    End If
                End With
            Next
        End With
    End With

    ' 현재 자동 필터 모드를 비활성화합니다.
    w.AutoFilterMode = False

    ' 워크시트의 "A1" 셀에서 첫 번째 열 (field 1)을 기준으로 값 10250을 필터링합니다.
     w.Range("A1").AutoFilter field:=1, Criteria1:=10250
End Sub

 

워크시트에 대한 AutoFilter 개체를 만들려면 직접 또는 Range 개체의 AutoFilter 메서드를 사용해 워크시트의 범위에 대한 자동 필터링을 켜야 합니다. 다음은 앞의 예제에서 모듈 수준 변수에 저장된 값을 사용해 Sales 워크시트에 대한 원래의 자동 필터링을 복원하는 예제입니다.

Sub RestoreFilters()
    Set w = Worksheets("Sales")
    Dim col As Long

    '자동 필터 모드 해제
    w.AutoFilterMode = False

    'filterArray를 반복
    For col = 1 To UBound(filterArray(), 1)
        If Not IsEmpty(filterArray(col, 1)) Then
            'Criteria2가 있는 경우
            If filterArray(col, 2) Then
                w.Range(currentFiltRange).AutoFilter field:=col, _
                                                     Criteria1:=filterArray(col, 1), _
                                                     Operator:=filterArray(col, 2), _
                                                     Criteria2:=filterArray(col, 3)
            Else
                'Creteria1이 배열인 경우
                If IsArray(filterArray(col, 1)) Then
                    w.Range(currentFiltRange).AutoFilter field:=col, _
                                                         Criteria1:=filterArray(col, 1), Operator:=xlFilterValues
                    ' Criteria1이 배열이 아닌 경우
                Else
                    w.Range(currentFiltRange).AutoFilter field:=col, _
                                                         Criteria1:=filterArray(col, 1)
                End If
            End If
        Else
        End If
    Next
End Sub

속성

FilterMode property

워크시트가 자동 필터 상태인 경우 True를 반환하며 읽기 전용인 Boolean입니다.

 

Syntax

expression.FilterMode

 

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

 

다음 코드는 자동필터 모드에 따라 메시지를 출력합니다.

Sub CheckFilterMode()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sales")
    
    ' 자동 필터 모드가 활성화되었는지 확인
    If ws.AutoFilterMode Then
        MsgBox "자동 필터 모드가 활성화되어 있습니다."
    Else
        MsgBox "자동 필터 모드가 비활성화되어 있습니다."
    End If
End Sub

Filters property

자동 필터링된 범위에 있는 필터를 모두 나타내는 Filters 컬렉션을 반환하며 읽기 전용입니다.

 

Syntax

expression.Filters

 

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

 

다음 코드는 변수를 Sales 워크시트에서 필터링된 범위의 열 3에 대한 필터의 Criteria1 속성 값으로 설정하는 예제입니다.

Sub GetFilterCriteria()
    Dim c1 As Variant
    Dim i As Long

    With Worksheets("Sales")
        If .AutoFilterMode Then
            With .AutoFilter.Filters(3)
                If .On Then
                    c1 = .Criteria1

                    ' c1이 배열인지 확인합니다.
                    If IsArray(c1) Then
                        ' 배열의 각 요소를 출력합니다.
                        For i = LBound(c1) To UBound(c1)
                            Debug.Print c1(i)
                        Next i
                    Else
                        ' 단일 값일 경우 그대로 출력합니다.
                        Debug.Print c1
                    End If
                Else
                End If
            End With
        Else
        End If
    End With

End Sub

' Output
' =Andrew Fuller
' =Janet Leverling
' =Laura Callahan

Range property

지정한 자동 필터가 적용되는 범위를 나타내는 Range 개체를 반환합니다. 

 

Syntax
expression.Range

 

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

 

다음 코드는 자동 필터가 설정된 경우 자동 필터가 적용된 범위를 출력합니다.

Sub ShowAutoFilterRange()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = Worksheets("Sales")

    ' 워크시트에 자동 필터가 설정되어 있는지 확인합니다.
    If ws.AutoFilterMode Then
        ' AutoFilter.Range 속성을 사용하여 자동 필터가 적용된 범위를 가져옵니다.
        Set rng = ws.AutoFilter.Range

        ' 범위의 주소를 출력합니다.
        Debug.Print "자동 필터가 적용된 범위: " & rng.Address
    Else
        Debug.Print "이 워크시트에는 자동 필터가 적용되지 않았습니다."
    End If

End Sub

Sort property

하나 이상의 정렬 열 및 AutoFilter 컬렉션의 정렬 순서를 반환합니다.

 

Syntax
expression.Sort

 

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

 

Sub SortWithAutoFilter()
    Dim ws As Worksheet

    ' "Sales" 워크시트를 설정합니다.
    Set ws = Worksheets("Sales")

    ' 화면 업데이트를 중지합니다.
    Application.ScreenUpdating = False

    ' 워크시트에 자동 필터가 설정되어 있는지 확인합니다.
    If ws.AutoFilterMode Then
        With ws.AutoFilter.Sort
            ' 세 번째 열에 대해 오름차순으로 정렬합니다.
            .SortFields.Clear
            .SortFields.Add Key:=ws.Range("C1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

            ' 변경사항을 적용하고 데이터를 정렬합니다.
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply

        End With

        Debug.Print "데이터가 성공적으로 정렬되었습니다."

    Else
        Debug.Print "이 워크시트에는 자동 필터가 적용되지 않았습니다."

    End If

    ' 화면 업데이트를 재개합니다.
    Application.ScreenUpdating = True

End Sub

 

매크로 실행 전

 

매크로 실행 후

메서드

AutoFilter.ShowAllData method

AutoFilter 개체에서 반환하는 데이터를 모두 표시합니다.

 

Syntax
expression.ShowAllData

 

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

 

다음 코드는 필터링이 되어 있는 경우 필터를 해제하고 모든 데이터를 보여줍니다.

Sub ShowAllData()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sales")

    ' 자동 필터가 적용되어 있고, 실제로 필터링이 되어 있다면,
    If ws.AutoFilterMode Then
        If ws.FilterMode Then
            ' 모든 데이터를 다시 보여줌 (필터 제거)
            ws.AutoFilter.ShowAllData
        End If
    End If

    Set ws = Nothing
End Sub

 

매크로 실행 전

 

매크로 실행 후

 

관련 글

 

Worksheet.AutoFilter 속성

Worksheet.AutoFilterMode 속성

Worksheet.FilterMode 속성

Filters 개체

Filter 개체

AutoFilter 메서드

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

Filter 개체  (0) 2023.09.11
Filters 개체  (0) 2023.09.10
Worksheet.FilterMode 속성  (0) 2023.09.08
Worksheet.AutoFilterMode 속성  (0) 2023.09.08
Worksheet.AutoFilter 속성  (0) 2023.09.08