메뉴
실무 위키VBA 코드Multi_AutoFilter

Multi_AutoFilter

Sub

지정한 범위에 여러 개 조건의 필터를 한 번에 적용하는 VBA 명령문입니다.

Multi_AutoFilter 코드 미리보기
구문 Multi_AutoFilter 기준열, 필터적용범위, 필터링값, [필터옵션]
인수구분 형식 설명
HeaderCell 필수 Range
필터링 조건이 들어갈 기준열의 머릿글입니다.
rngFilter 필수 Range
필터가 적용될 전체 범위입니다.
FilterValue 필수 String
기준열에 적용할 필터링 조건입니다.
조건이 여러 개일 경우 줄바꿈으로 나눠서 입력합니다.
FilterType 선택 XlAutoFilterOperator
필터링 옵션입니다. 기본값은 '값 기준' 필터링입니다.

마스터 코드

복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요
Module1 · Multi_AutoFilter
Sub Multi_AutoFilter(HeaderCell As Range, rngFilter As Range, FilterValue As String, Optional FilterType As XlAutoFilterOperator = xlFilterValues)
Dim strAll As String
Dim varStr As Variant: Dim Var As Variant
Dim dicVar As Dictionary: Dim varDic As Variant '/* Microsoft Scripting Runtime 라이브러리 추가 */
Dim initCol As Long
Dim a As Long: Dim i As Variant: a = 0
Set dicVar = New Dictionary
'<--! 줄바꿈 기호를 세로바두개(||)로 변경합니다 -->
strAll = Replace(FilterValue, Chr(10), "||")
strAll = Replace(strAll, Chr(13), "||")
'<--! 배열로 반환한 뒤, Dictionary에 추가 (중복값 제거) -->
varStr = Split(strAll, "||")
For Each Var In varStr
If Not dicVar.Exists(Var) And Len(Var) > 0 Then
dicVar.Add Var, Len(Var)
End If
Next
'<--! Dictionary 를 배열로 재반환 -->
ReDim varDic(0 To dicVar.Count - 1)
For Each i In dicVar.Keys()
varDic(a) = i
a = a + 1
Next
'<--! 필터적용 범위의 시작점 -->
initCol = rngFilter.Column
'<--! 필터적용 범위를 해당 조건(배열=varDic)으로 필터링합니다 -->
rngFilter.AutoFilter _
Field:=HeaderCell.Column - initCol + 1, _
Criteria1:=varDic, _
Operator:=FilterType
End Sub

활용 예제

지역 3개 필터 + 상위 10개 항목 필터 적용
Dim FilterRng as Range: Set FilterRng = Sheet1.Range("A1:H100")
'// A1:H100 = 필터가 적용될 전체 범위입니다
With Sheet1
'// <--! D열 (지역)에 '회기동, 본동, 대치동' 필터를 적용합니다. -->
Multi_AutoFilter .Range("D1"), FilterRng, "회기동" & vbNewLine & "본동" & vbNewLine & "대치동"
'// <--! H열 (개수)의 상위 10개 항목을 필터링합니다. -->
Multi_AutoFilter .Range("H1"), FilterRng, "10", xlTop10Items
End With

안내사항

실행 전 VBA 편집기의 '도구 → 참조'에서 Microsoft Scripting Runtime 라이브러리를 활성화해야 합니다.
필터링 값은 줄바꿈으로만 항목을 구분하며 콤마(,)는 구분자로 인식하지 않습니다.
와일드카드 검색은 최대 2개 조건까지만 지원하며, 와일드카드를 포함한 조건이 3개 이상이면 와일드카드 검색 기능을 사용할 수 없습니다.
댓글 15
5 (8개 평가)
나릴리
나릴리 2020.02.11 16:50
안녕하세요.
매번 강의 내용 잘 보고있습니다. 감사합니다.

올려주신 강의 질문이 있습니다.
예제 파일로 ctrl+t 표만들기를 적용하면 필터가 제대로 작동을 하는데요.

예제 파일에서 내용 및 열 몇개 추가 및 수정하고는 필터가 제대로 작동을 하는데
여기서 ctrl+t 표만들기로 적용을 하면 계속 오류가 납니다.

'1004 런타임 오류, range 클래스 중 autofilter 메서드에 오류' 메시지가 출력되고

rngFilter.AutoFilter _
Field:=HeaderCell.Column - initCol + 1, _
Criteria1:=varDic, _
Operator:=FilterType

위 코드가 노란색으로 표시가 됩니다.

내용 수정 후 표만들기를 적용하는 방법은 없을까요?

감사합니다.
오빠두엑셀
오빠두엑셀 작성자 2020.02.11 18:39
안녕하세요?^^
본 명령문은 표기능과 상관없이 잘 동작합니다.
말씀하신 오류는 Multi_AutoFilter 명령문 인수를 잘못 입력하셔서 발생한듯 합니다.
예제파일의 '테스트_명령문'에 작성된 명령문을 확인해보시겠어요?^^
만약 열을 새로 추가하셨다면, 명령문의 첫번째인수인 HeaderCell 인수도 같이 변경해주셔야 합니다.
제 답변이 도움이 되셨길 바랍니다.
감사합니다.
illh****
illh**** 2020.08.13 17:45
하나의 셸에 아래와 같이 여러 단어가 있을때 다중 필터로 여러 단어 검색은 어떻게 하나요?
"OLED 회로설계 Orcad FPGA TFT FAE 영어 중국어"
오빠두엑셀
오빠두엑셀 작성자 2020.08.14 15:21
여러 단어 검색이 정확히 어떤 상황을 이야기 하시는 건가요?
하나의 셀에 "OLED 회로설계 Orcad FPGA TFT FAE 영어 중국어" 가 입력되어 있으면,
[ *회로설계* ]
이렇게 검색하시면 회로설계를 포함하는 값을 모두 필터링합니다.
rocky1976
rocky1976 2021.09.09 12:59
혹시 배열이 너무 길면 조회를 못 할 수가 있나요?
DX9310-WH01KR
이런 식으로 노트북 다중 필터 검색 하면 하나도 안 되네요
오빠두엑셀
오빠두엑셀 작성자 2021.09.09 18:48
안녕하세요?^^
배열 크기에 상관없이 잘 동작합니다.
작성한 명령문에 잘못된 부분이 없는지 다시 한번 확인해보세요.
Screenshot_1
오빠두엑셀
오빠두엑셀 작성자 2021.09.09 18:48
안녕하세요?^^
배열 크기에 상관없이 잘 동작합니다.
작성한 명령문에 잘못된 부분이 없는지 다시 한번 확인해보세요.
Screenshot_1
scbaekd****
scbaekd**** 2021.11.16 13:15
선생님 고급필터를 계속 공부하는데요..... 한셀에 여러가지 조건을 부여하고 싶은데요... 대상셀이 >0 and cellcolor =28 이런 형태로도 가능할지요??????
박혜진
박혜진 2022.06.22 15:21
안녕하세요. 오빠두엑셀 덕분에 매크로 설정에 대해 쉽게 이해할 수 있었습니다. 올려주신 강의와 관련해서 궁금한 점이 있어서요.
해당 다중 필터 부분을 다른 매크로 형식에 넣어서 여러항목이 검색되도록 매크로 세팅을 하고 싶은데요. 해당 매크로 형식을 어떤 부분에 넣어햐 할지 애매해서요. 그냥 검색하고자 하는 셀을 설정해서 기존 매크로 밑에 매크로를 추가하면 될까요?
오빠두엑셀
오빠두엑셀 작성자 2022.06.23 15:58
매크로로 여러 시트나 파일을 동시에 검색하려면 코드를 전반적으로 수정해야 합니다. 만약 다른 특정 파일에서도 사용하시려면 랐므하신 것 처럼, 해당 파일에 매크로를 추가후 사용하시거나, 추가기능 형태로 파일을 변경 후 사용하면 됩니다.
추가기능 제작에 대한 내용은 아래 위캔두 프리미엄 워크샵 강의를 참고해보세요.
https://www.oppadu.com/엑셀-live-64강/
봉s
봉s 2023.07.24 09:32
안녕하세요. 항상 많은 도움주셔서 감사드립니다.
현재 VBA를 사용하여 Pivot Table을 자동으로 생성하는 것까지 완료하였습니다.
추가적으로 Filter 항목을 VBA로 구현할 수 있는지 문의 드립니다.
Pivot Table에서 아래와 같이 해당월을 제외를 할려고 하는데
----------------------------------------------------------------------------------------------
With ActiveSheet.PivotTables("피벗 테이블1").PivotFields("Date")
'    .PivotItems("7/3/2023").Visible = False
'    .PivotItems("7/4/2023").Visible = False
End With
----------------------------------------------------------------------------------------------
RawData에서 "7/5/2023" 하나가 추가되거나 "7/42023" 이 삭제되어 있으면
당연히 Error가 납니다.
Date로 정리된 Pivot Table에서 TEXT(TODAY(),"yyyy-mm") 값을 인식하여 2023-07에 해당하는 것만 False 처리할 방법이 있을가요?
목적은 Date에서 해당월(7월)만 제외한 값들만 보기 위함입니다.
오빠두엑셀
오빠두엑셀 작성자 2023.07.27 22:18
안녕하세요.
피벗테이블의 각 항목을 우선 배열로 받아온 후, 배열의 각 값을 년/월로 변환하여 해당 월의 항목을 필터에서 제외 하도록 구현하면 될 것 같습니다.
어허허이
어허허이 2024.04.16 11:03
매번 강의 잘 듣고 있습니다. 제공해주신 파일에서는 잘 작동하는데, 코드를 붙여 넣기 하고 새로 만들면 사용자 정의 형식이 정의 되지 않았다고 나옵니다. 어디서 잘못 된것일까요?
오빠두엑셀
오빠두엑셀 작성자 2024.04.17 08:54
안녕하세요.
매크로 편집기 실행 - [도구] 탭 - [참조] 에서
Microsoft Scripting Runtime
을 체크한 후 다시 실행해보시길 바랍니다.
감사합니다.
강민준🤗
강민준🤗 2024.08.11 12:41
좋은 자료 감사합니다.🙇‍♂️
스크랩 완료