Range 개체

AdvancedFilter 메서드

노만e 2025. 3. 10. 19:32

엑셀 VBA에서 AdvancedFilter 메서드는 특정 조건을 만족하는 데이터만 필터링하거나, 필터링된 데이터를 다른 범위로 복사할 때 사용됩니다.

즉, 고급 필터를 적용하여 중복 제거, 조건 검색, 특정 범위 복사 등의 기능을 수행할 수 있습니다.


1. 기본 문법

Range("데이터 범위").AdvancedFilter Action:=필터 유형, CriteriaRange:=조건 범위, CopyToRange:=복사 위치, Unique:=중복제거여부
  • 데이터 범위 → 필터링할 원본 데이터 범위
  • Action → 필터 적용 방식 (xlFilterInPlace = 원래 범위에서 필터링, xlFilterCopy = 다른 위치로 복사)
  • CriteriaRange → 필터링 조건을 지정하는 범위
  • CopyToRange → 필터링된 데이터를 복사할 위치 (필수: Action:=xlFilterCopy 사용 시)
  • Unique → True = 중복 제거, False = 중복 포함

📌 조건 범위 (CriteriaRange)는 반드시 필터링할 데이터와 동일한 헤더를 포함해야 함

📌 데이터 범위에는 반드시 첫 번째 행에 열 이름(헤더)이 있어야 함


2. 기본 필터 적용 (원본 데이터에서 바로 필터링)

Sub 기본_필터적용()
Range("A1:C100").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("E1:E2")
End Sub

📌 A1:C100 데이터를 E1:E2의 조건에 따라 필터링

📌 원본 데이터에서 필터가 적용되며 결과를 유지


3. 필터 해제 (모든 데이터 다시 표시)

Sub 필터해제()
ActiveSheet.ShowAllData
End Sub

📌 고급 필터로 숨겨진 데이터를 다시 표시


4. 필터링된 데이터 다른 위치에 복사

Sub 필터된데이터_복사()
Range("A1:C100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("E1:E2"), CopyToRange:=Range("G1:I1")
End Sub

📌 A1:C100 데이터에서 E1:E2 조건을 만족하는 데이터를 G1:I 범위에 복사

📌 원본 데이터는 변경되지 않음


5. 중복 제거 후 필터링된 데이터 복사

Sub 중복제거_필터복사()
Range("A1:C100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("E1:E2"), CopyToRange:=Range("G1:I1"), Unique:=True
End Sub

📌 A1:C100에서 조건을 만족하는 데이터를 G1:I 범위에 복사하며, 중복된 행은 제거


6. 고유 값만 추출 (중복 제거)

Sub 고유값_추출()
Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("C1"), Unique:=True
End Sub

📌 A1:A100의 고유 값만 C1 열로 복사 (중복 제거됨)


7. 특정 조건(예: '매출'이 1000 이상인 데이터 필터링)

Sub 매출_1000이상_필터()
Range("A1:D100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("F1:F2"), CopyToRange:=Range("H1:K1")
End Sub

📌 F1:F2에 "매출" 헤더와 >=1000 조건을 입력하면, 매출이 1000 이상인 데이터만 H1:K 범위에 복사됨


8. 여러 조건을 사용한 필터링 (OR 조건)

Sub 여러조건_OR필터()
Range("A1:D100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("F1:F3"), CopyToRange:=Range("H1:K1")
End Sub

📌 F1:F3 범위에 여러 개의 조건을 입력하면 OR 조건으로 필터링 가능


9. 특정 열만 복사하여 필터링

Sub 특정열_복사필터()
Range("A1:D100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("F1:F2"), CopyToRange:=Range("H1:H1")
End Sub

📌 필터링된 결과에서 특정 열(A~D 중 일부)만 복사 가능


10. 필터링 후 결과 행 개수 출력

Sub 필터_결과개수_출력()
Dim 마지막행 As Long
Range("A1:D100").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2")

' 필터링 후 남아있는 행 개수 계산
마지막행 = Range("A" & Rows.Count).End(xlUp).Row
MsgBox "필터링된 행 개수: " & 마지막행 - 1 ' 헤더 제외
End Sub

📌 필터링 후 남아있는 데이터 개수를 메시지 박스로 출력


11. 필터링된 데이터 자동 저장

Sub 필터링된데이터_저장()
Dim wb As Workbook
Dim ws As Worksheet

' 새 워크북 생성
Set wb = Workbooks.Add
Set ws = wb.Sheets(1)
' 필터링된 데이터 복사
Range("A1:D100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("F1:F2"), CopyToRange:=ws.Range("A1")
' 파일 저장
wb.SaveAs "C:\Users\Public\FilteredData.xlsx"
wb.Close
MsgBox "필터링된 데이터가 저장되었습니다."
End Sub

📌 필터링된 데이터를 새 엑셀 파일로 저장 (C:\Users\Public\FilteredData.xlsx)


📝 정리

기능
VBA 코드
기본 필터 적용
Range("A1:C100").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("E1:E2")
필터 해제
ActiveSheet.ShowAllData
필터링된 데이터 복사
Action:=xlFilterCopy, CopyToRange:=Range("G1:I1")
중복 제거 후 복사
Action:=xlFilterCopy, Unique:=True
고유 값만 추출
Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("C1"), Unique:=True
특정 조건 필터링 (예: >=1000)
AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("F1:F2")
여러 조건 (OR) 필터링
CriteriaRange:=Range("F1:F3")
특정 열만 필터링하여 복사
CopyToRange:=Range("H1:H1")
필터링된 결과 개수 출력
MsgBox "필터링된 행 개수: " & 마지막행 - 1
필터링된 데이터 자동 저장
wb.SaveAs "C:\Users\Public\FilteredData.xlsx"

🔥 VBA의 AdvancedFilter를 활용하면 복잡한 데이터 필터링을 자동화할 수 있습니다! 🚀