- 최초 작성일: 2004-05-07
- 최종 수정일: 2026-09-30
- 조회수: 9 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 필터링 정보 표시하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
감옥과 수도원은 세상과 고립되어 있다는 점이 같지만, 불평을 하느냐 감사를 하느냐에 따라 감옥이 수도원이 될 수도 있다는 마쓰시다 고노스케의 글이 있습니다. 긍정적인 사고방식의 중요성을 이야기하는 글이지요. 세상에서 가장 바꾸기 쉬운 것(물론 말처럼 쉬운 것은 아니지만…)은 자기 자신입니다. 천국과 지옥은 따로 있지 않습니다.
필터링 정보 표시하기
핵심 요약: 자동 필터 조건을 실시간으로 표시하기
자동 필터를 설정하면 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
을 메세지 박스로 띄어보면 알수 있는데..
그럴려면...매크로를 실행해야 합니다.
제가 원하는 것은 필터 항목에서 기준을 선택하면,
선택과 동시에 특정 셀에 선택한 내용을 표시하고 싶거든요
그럴려면, 셀에 함수를 적용해야 할거 같은데… 잘 모르겠군요.
아니면..매크로(또는 프러시져)를 쓰더라도..
필터항목의 기준을 선택하면..바로 선택한 항목의 기준을 표시해줘야 합니다.
좀더 이해가 잘 되는시는지 모르겠네요..
꼭 답변 바랍니다.
아래와 같이 자동 필터가 설정된 데이터가 있습니다. 임의의 필드를 대상으로 필터링을 해 보세요.
데이터는 월, 팀장, 영업사원, 브랜드, 판매수량, 판매금액 여섯 개 필드로 구성되어 있고 머리글에 자동 필터가 설정되어 있습니다.
필드 옆의 드롭다운 버튼을 눌러 필터를 설정하면,
이와 같이 메시지 박스가 나타나면서 어떤 필드에 어떤 조건으로 필터링이 되었는지에 대한 정보를 알려주고 있습니다. 희안하지요? ^^
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 이벤트와 휘발성 함수를 조합하는 약간의 트릭으로 해결할 수 있습니다. 더 나은 방법을 찾으셨다면 꼭 알려 주세요.