엑셀 vba 필터 - egsel vba pilteo

엑셀 vba 필터 - egsel vba pilteo

안녕하세요

오늘은 엑셀의 핵심 기능 중 하나인 "필터"에 대해 알아보겠습니다.

엑셀 vba 필터 - egsel vba pilteo

일반 엑셀에서 필터의 단축키는 "Ctrl +Shift + L"이며, 우리는 이것을 VBA로 구현해 보겠습니다.

그럼 바로 시작합니다.

필터를 사용하는 가장 간단한 방법은 Autofilter 메서드를 사용하는 겁니다. 여러 개의 인자 값을 가지기 때문에 어려워 보일 수도 있으나, 사실 간단한 내용입니다.

구문)

Range.AutoFilter(Field, Criteria1, Operator, Criteria2, SubField, VisibleDropDown)

- Field : 필드는 정수 값(실제 데이터 타입은 Variant)을 가지며, 가장 왼쪽 값부터 "1"을 갖습니다.

엑셀 vba 필터 - egsel vba pilteo

Field 참고 이미지

- Criteria1 : 첫 번째 찾는 기준 값

- Operator : xlAutoFilterOperator의 값 중 지정합니다.

xlAutoFilterOperator

설명

xlAnd

Criteria1 and Criteria2

xlBottom10Items

Criteria1에서 지정한 기준 값 중 가장 낮은 값

xlBottom10Percent

Criteria1에서 지정한 값 중 가장 낮은 비율

xlFilterCellColor

셀색

xlFilterDynamic

동적 필터

xlFilterFontColor

글자색

xlFilterIcon

필터 아이콘

xlFilterValues

필터 값

xlOr

Criteria1 or Criteria2

xlTop10Items

Criteria1에서 지정한 기준 값 중 가장 높은 값

xlTop10Percent

Criteria1에서 지정한 값 중 가장 높은 비율

- Criteria2 : 두 번째 찾는 기준 값(Criteria1과 Operator을 같이 사용해야 합니다.)

-SubField : 서브 필드(데이터 유형이 여러 개일 경우 사용 가능)

- VisibleDropDown : True의 경우 필터 적용 시 나오는 화살표 값을 표시합니다(기본값).

cf) 모든 인자 값을 제거하고 "Range(셀 혹은 범위).AutoFilter"만 쓸 경우 필터 적용 시 나오는 화살표 값만 표시 또는 숨김 됩니다. 표의 첫 번째 셀만 입력해도 표 전체에 적용됩니다.

엑셀 vba 필터 - egsel vba pilteo

예제 1) 판매가가 2500원인 목록만 필터링하기

단일 조건

엑셀 vba 필터 - egsel vba pilteo

위 표에서 "판매가"가 "2500"인 목록을 필터링해보겠습니다.

상품명이 "라, 자"가 해당되겠죠?

엑셀 vba 필터 - egsel vba pilteo

Option Explicit Sub 필터1() Range("A1").AutoFilter Field:=3, Criteria1:=2500 End Sub

문법이 복잡해 보여서 어려워 보였지만 실제론 쉽죠?ㅎㅎ

하지만, 아직 만족할 만한 내용은 아닌 거 같습니다.

- 실제 엑셀로 필터링 작업을 하다 보면 유의미한 값은 남기고 나머지 행은 모두 삭제합니다. 왜냐하면, 필터를 적용한 상태에서는 '채우기 핸들'이 원하는 대로 작동하지 않으며, 기타 예상치 못한 결과를 초래하기 때문입니다.

그래서 준비한 예제 2번!

예제 2) 판매가가 2500원인 목록만 남기고 다른 행은 삭제 시키기

- 예제를 보셨을 때는 어떻게 하시면 좋겠다고 생각하셨나요?

음... (물론 저라면요;;) 생각의 방향은 판매가가 2500원이 아닌 셀을 필터를 걸어 모두 삭제하고, 나머지 값만 나타나게 하면 되지 않을까?라고 잡으면 좋을 거 같아요. 그렇죠?

방법은 예제 3에서 적용할 "다중 조건"을 Criterial1의 값으로 설정하셔도 되긴 하지만, 만약 필요 없는 셀 이 1억 개라면, 키보드로 전부 필요 없는 셀의 값을 타이핑하는 건 좀 아니잖아요? ᄒᄒ(물론, 예제 1을 지난 시간에 배운 값으로 붙여넣기로 다른 시트에 붙여 넣는 방법도 있겠네요.)

하지만, 우린 고급 지고 간단한 방법을 사용할 거예요. 이렇게 내가 원하는 값의 여집합("<>")을 찾고 싶을 때는 더 간단한 방법을 쓰면 됩니다. 값 앞에 따옴표로 묶은 부등호앰퍼샌드(Ampersand)로 연결해줍니다.

간단하죠?ㅎㅎ

큰 값, 작은 값 모두 위 코드를 활용하셔서 부등호만 바꾸시면 돼요.

다시 예제로 돌아와서 "판매가가 2500원인 행만 남기고, 나머지 행들은 삭제"하는 코드를 작성해 보겠습니다.

엑셀 vba 필터 - egsel vba pilteo

a. 필터만 적용했을 경우의 결과값

엑셀 vba 필터 - egsel vba pilteo

b. 불필요한 행을 삭제했을 경우의 결과값

11행 짜리 표라서 다행이지만, 1억 행짜리 표였다면, 엑셀의 용량(크기)부터 b의 매크로가 훨씬 작고, 오류로 인해 파일이 날아갈 확률도 적어질 겁니다.

코드)

Option Explicit Sub 필터1() Application.DisplayAlerts = False '엑셀의 경고창 끄기 Application.ScreenUpdating = False '화면 업데이트 끄기 Range("A1").AutoFilter Field:=3, Criteria1:="<>" & 2500 '2500원이 아닌 셀만 필터링 Range("A2", Cells(Rows.Count, "A").End(xlUp)).Rows.Delete '현재 표에서 표시된 셀 삭제 Range("A1").AutoFilter '필터 해제 Application.DisplayAlerts = True '엑셀 경고창 켜기 Application.ScreenUpdating = True '화면 업데이트 켜기 End Sub

cf) Application.DisplayAlerts = False 명령은 엑셀의 경고 창을 끄는 것입니다. 여기서 말하는 엑셀의 경고 창이란 아래와 같은 창을 말합니다.

엑셀 vba 필터 - egsel vba pilteo

아래 경고 창이 나올 경우 매크로가 중지되기 때문에 꺼줍니다.

예제 3) 상품명이 "가, 다, 바"인 목록만 나타내기

다중 조건

- 방법은 Criterial1 값으로 일전에 배운 배열 함수와 Operator 값을 이용하면 됩니다.

엑셀 vba 필터 - egsel vba pilteo

Sub 필터2() Range("A1").AutoFilter Field:=2, Criteria1:=Array("가", "다", "바"), Operator:=xlFilterValues End Sub

엑셀 vba 필터 - egsel vba pilteo

엑셀 vba 필터 - egsel vba pilteo