• 최초 작성일: 2004-05-07
  • 최종 수정일: 2026-09-30
  • 조회수: 9 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 필터링 정보 표시하기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

감옥과 수도원은 세상과 고립되어 있다는 점이 같지만, 불평을 하느냐 감사를 하느냐에 따라 감옥이 수도원이 될 수도 있다는 마쓰시다 고노스케의 글이 있습니다. 긍정적인 사고방식의 중요성을 이야기하는 글이지요. 세상에서 가장 바꾸기 쉬운 것(물론 말처럼 쉬운 것은 아니지만…)은 자기 자신입니다. 천국과 지옥은 따로 있지 않습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

필터링 정보 표시하기

핵심 요약: 자동 필터 조건을 실시간으로 표시하기

자동 필터를 설정하면 Click 이벤트가 아닌 Calculate 이벤트로 감지해, 어떤 필드가 어떤 조건으로 필터링되었는지 메시지 상자에 알려 주고 필터링된 필드의 머리글은 빨간색으로 표시합니다.

  • 1단계: 재계산될 때마다 발생하는 Worksheet_Calculate 이벤트를 사용합니다.
  • 2단계: 휘발성 함수 TODAY가 들어 있는 셀을 두어 필터 변경 시에도 재계산이 일어나게 합니다.
  • 3단계: AutoFilter.Filters 컬렉션을 돌며 Criteria1/2와 Operator로 필터링 정보를 조합합니다.

Step 1: 어떤 질문이었을까요?

질문 하나

안녕하세요.
질문있슴다...
엑셀 자체를 잘 쓰지 못하기 때문에 머리가 아프네요.

번호 이름 성별
1 a 남자
2 b 여자
3 c 여자
4 d 남자

뭐 이런 데이터가 잇다고 할때 번호, 이름, 성별을 자동필터 설정으로하고
각 필터를 선택하면...예를 들면, 성별 필터에서 남자를 선택하면 그 필터 항목을
메세지 박스로 "남자" 에 대해서 필터링 했습니다.
라는 메세지를 띄울 수 있나요?

이어지는 비슷한 질문…

전에 질문을 했는데 어렵게 질문한 듯 해서 다시 질문합니다.
그러니까..자동필터에서 사용자가 선택한 항목의 기준에 대해 무엇을 선택했는지를
셀에 표시하고 싶은 것입니다. 간단한 예를 들죠.

[선택한 기준표시셀]

이름 :과학: 수학
김 :40 : 20
김 :50 : 90
김 :80 : 70
신 :50 : 30
이 :90 : 70
신 :100 : 30

여기서 항목은 이름,과학,수학
기준은 김,이,신,20,40,50 등...
이런 데이터에서 필터 항목 중 이름의 '김'을 선택하면
이름 바로 위의 셀에 김을 표시하는 것입니다.

필터 항목에서 무엇을 선택했는지를 알려면
VBA에서, ActiveSheet.Autofilter.filters(1).Criteria1
을 메세지 박스로 띄어보면 알수 있는데..
그럴려면...매크로를 실행해야 합니다.

제가 원하는 것은 필터 항목에서 기준을 선택하면,
선택과 동시에 특정 셀에 선택한 내용을 표시하고 싶거든요
그럴려면, 셀에 함수를 적용해야 할거 같은데… 잘 모르겠군요.

아니면..매크로(또는 프러시져)를 쓰더라도..
필터항목의 기준을 선택하면..바로 선택한 항목의 기준을 표시해줘야 합니다.

좀더 이해가 잘 되는시는지 모르겠네요..
꼭 답변 바랍니다.

아래와 같이 자동 필터가 설정된 데이터가 있습니다. 임의의 필드를 대상으로 필터링을 해 보세요.

데이터는 월, 팀장, 영업사원, 브랜드, 판매수량, 판매금액 여섯 개 필드로 구성되어 있고 머리글에 자동 필터가 설정되어 있습니다.

필드 옆의 드롭다운 버튼을 눌러 필터를 설정하면,

필터링 정보 메시지 상자 - 월=4월, 팀장=권준우로 필터링되었음을 알려 준다
아이엑셀러

이와 같이 메시지 박스가 나타나면서 어떤 필드에 어떤 조건으로 필터링이 되었는지에 대한 정보를 알려주고 있습니다. 희안하지요? ^^

Step 2: Calculate 이벤트를 이용한 트릭

어떻게 하면 (자동 필터링 된 상태에서) 드롭다운 버튼을 클릭하면 리얼 타임으로 특정한 동작을 하도록 할 수 있을까요? VBA 공부를 아주 열심히 하신 어느 분이 그러시는군요.

그 분 : (자신 만만하게) "아, 그야 당연히… Click 이벤트를 사용하면 되는 거 아닙니까?"
Exceller : (음흉한 미소를 띄며) 과연 그럴까요? ^^
그 분 : (뜻밖의 반응에 약간 위축되며 대장금 버전으로) 클릭하면 발생하는 것이 클릭 이벤트이기에 그리 답변드린 것이온데… 왜 그렇게 생각하느냐고 물으시면 그리 생각나서 그랬다고 밖에… T.T
Exceller : (자신의 태도를 깊이 반성하며) 죄송합니다.

클릭 이벤트로는 해결할 수 없습니다. 해서 약간의 트릭을 사용 하였습니다. 바로… 워크시트 오브젝트의 Calculate 이벤트를 사용한 것입니다.

그런데 이 Calculate 이벤트는 워크시트가 재계산 될 때마다 발생을 하므로 휘발성 함수의 하나인 Today 함수를 사용하여 어떤 변동 사항이 있을 때마다 재계산이 되도록 설정하였습니다. 단순히 보기 좋으라고 요렇게 표시한 것이 아니랍니다.

Step 3: 코드 살펴보기

코드를 살펴보도록 하지요.

먼저 Worksheet 개체의 Calculate 이벤트 프로시저이고, 이어지는 FilterInfo 함수는 일반 모듈 시트에 작성되어 있습니다.

Private Sub Worksheet_Calculate()

    Dim objFilter As Object
    Dim rngTitle As Range
    Dim lngRow As Long
    Dim intCol As Integer
    Dim strMsg As String
    Dim strInfo As String
    On Error Resume Next
    Set rngTitle = Range("Title")
    ' 데이터의 헤더 부분에 Title 이라는 이름을 미리 정의해 두고 불러다 사용합니다.

    With ActiveSheet.AutoFilter.Range
    ' 자동 필터가 설정되어 있는 영역의 위치 정보를 lngRow와 intCol 변수에 담아 둡니다.

        lngRow = .Rows(1).Row
        intCol = .Columns(1).Column
    End With

    For Each objFilter In ActiveSheet.AutoFilter.Filters
    ' 필터링 되어 있는 필드를 찾아 냅니다.

        If objFilter.On Then
        ' 필터링 된 필드이면 셀 색상을 빨간 색으로, 글자색을 흰 색으로 표시하고…

            With Cells(lngRow, intCol)
                .Interior.ColorIndex = 3
                .Font.ColorIndex = 2
            End With
        Else
            With Cells(lngRow, intCol)
                .Interior.ColorIndex = xlColorIndexNone
                .Font.ColorIndex = 1
            End With
        End If
        intCol = intCol + 1
    Next objFilter

    strInfo = FilterInfo(rngTitle)
    ' 필터링 정보를 파악하기 위한 사용자 지정 함수인 FilterInfo를 호출합니다.
    ' 이 때 rngTitle, 즉 표의 header 부분을 함께 인수로 건네 줍니다.

    If strInfo = "" Then Exit Sub

    strMsg = strMsg & "<필터링 Information>" & vbCr & vbCr
    strMsg = strMsg & strInfo
    MsgBox strMsg, , "www.iExceller.com"

End Sub

Function FilterInfo(rngTitle As Range) As String

    Dim objFilter As Filter
    Dim i As Integer
    Dim strField As Variant
    Dim strFilter As String
    strField = Array("월", "팀장", "영업사원", "브랜드", "판매수량", "판매금액")
    On Error Resume Next

    With ActiveSheet.AutoFilter
        If Intersect(rngTitle, .Range) Is Nothing Then Exit Function
        ' 만약 표의 타이틀 부분이 제대로 설정되어 있지 않다면 함수를 빠져 나갑니다.
        ' 이 때 Intersect 메서드를 사용한 점을 눈여겨 보시기 바랍니다.

        For Each objFilter In .Filters
        ' 필터링 된 필드를 돌며 정보들을 strFilter라는 문자열 변수에 차곡차곡 담습니다.

            If Not objFilter.On Then GoTo ET
            strFilter = strFilter & strField(i) & objFilter.Criteria1 & vbCr

            Select Case objFilter.Operator
            ' 사용자 지정 자동 필터가 설정된 경우에 대비해서 아래와 같이 설정합니다.

                Case xlAnd
                    strFilter = Left(strFilter, Len(strFilter) - 1)
                    strFilter = strFilter & " 그리고 " & Mid(objFilter.Criteria2, 2)
                Case xlOr
                    strFilter = Left(strFilter, Len(strFilter) - 1)
                    strFilter = strFilter & " 또는 " & Mid(objFilter.Criteria2, 2)
                Case Else
            End Select

ET:
            i = i + 1
        Next objFilter
    End With

    FilterInfo = strFilter

End Function

많이 응용해 보시고 더 나은 방법을 찾으시거든 꼭 알려주시기 바랍니다.

오늘은 여기까지…

정리 — 필터링 정보 표시 코드 핵심

구분 사용한 코드 역할
이벤트 Worksheet_Calculate 재계산될 때마다 실행
재계산 유도 =TODAY() 휘발성 함수로 재계산 발생
필터 목록 ActiveSheet.AutoFilter.Filters 필드별 필터 정보 컬렉션
필터 여부 objFilter.On 해당 필드가 필터링되었는지 확인
조건 값 objFilter.Criteria1 / Criteria2 / Operator 필터 조건과 사용자 지정 연산자

자주 묻는 질문 (FAQ)

Q1. 자동 필터의 드롭다운을 클릭할 때 발생하는 이벤트는 없나요?

자동 필터를 위한 전용 이벤트는 없고, Click 이벤트로도 잡을 수 없습니다. 그래서 필터를 적용하면 재계산이 일어난다는 점을 이용해 Worksheet_Calculate 이벤트를 사용합니다.

Q2. 왜 TODAY 함수를 사용하나요?

Calculate 이벤트는 워크시트가 재계산될 때 발생합니다. TODAY는 휘발성 함수이므로 워크시트에 변화가 생길 때마다 재계산되어 필터 변경 시에도 이벤트가 발생하게 됩니다.

Q3. 사용자 지정 필터(그리고/또는)도 표시할 수 있나요?

네, Operator 속성이 xlAnd인지 xlOr인지에 따라 Criteria2 값을 '그리고' 또는 '또는'으로 이어 붙여 표시하도록 코드를 작성했습니다.

마치며

Click 이벤트로 해결할 수 없는 일도 Calculate 이벤트와 휘발성 함수를 조합하는 약간의 트릭으로 해결할 수 있습니다. 더 나은 방법을 찾으셨다면 꼭 알려 주세요.