회사 생존기/엑셀 VBA로 생존하기

VBA로 엑셀 데이터 필터기능 적용하기!

택이형. 2023. 3. 16.

 

『 수많은 raw데이터 중에서 내가 원하는 부분만 걸러서 보기 위해서 엑셀의 필터기능을 많이 사용하고 계십니다. 필터기능 역시 VBA를 통해 구현이 가능한데요. 원하는 기준으로 필터 적용 후 필터된 데이터를 복사하여 필요한 부분에 붙여 넣는 코드를 알아보도록 하겠습니다. 이를 통해 업무자동화에 한 발짝 더 다가갈 수 있으면 좋겠습니다. 』

 

 

VBA로 데이터 필터기능 적용하기

 

 

VBA로 필터기능 사용하기

VBA 필터기능 사용하기의 기본문법은 다음과 같습니다.

정렬범위.AutoFilter 필터위치, 필터기준

 

기본문법을 살펴보면 정렬범위를 선택 후 필터기준을 통해 필터를 진행하게 됩니다. 기본적으로 VBA는 엑셀에서 일반적으로 사용되는 내용들을 똑같이 구현할 수 있기 때문에 쉽게 배울 수 있다는 장점이 있습니다.

 

그럼 VBA를 사용하여 필터를 진행하는 방법을 이해할 수 있도록 엑셀 데이터를 통해 예를 들어보도록 하겠습니다.

아래의 예시를 살펴보시죠. 

 

<필터 예시>
<필터 예시>

 

A열은 "축제"가, B열에는 "장소"가, C열에는 "담당자"가 입력된 데이터입니다. 엑셀 필터기능을 통해 "E2"셀의 기준으로 설정한 "서울"을 가지고 데이터에 필터를 적용하였습니다. 기준자체가 "장소"를 나타내고 있기 때문에 "B열"을 기준으로 필터를 적용하게 됩니다. 

 

 

&lt;필터 결과&gt;
<필터 결과>

 

필터 된 결과를 살펴보면 장소가 "서울"인 곳이 필터 되어 나타나는 것을 볼 수 있습니다.

엑셀에서 사용하였던 필터기능을 VBA를 통해 구현해 보도록 하겠습니다. 코드는 아래와 같습니다.

 

Sub 필터()

Dim rng As Range
' 범위 선언

Set rng = Range("a1").CurrentRegion
' "a1"셀부터 "C열"의 데이터가 있는 마지막셀까지의 범위를 rng 변수로 설정

rng.AutoFilter 2, Range("e2")
' rng로 설정된 범위에 필터를 적용하되, 두번째 열인 "B"열에 "E2셀"의 "서울"을 기준으로 필터  

End Sub

 

Set rng = Range("a1").CurrentRegion는 "a1"셀부터 "C열"의 데이터가 있는 마지막셀까지의 범위를 rng 변수로 설정하는 코드입니다. 앞서 배웠던 CurrentRegion을 통해 연속된 데이터 전체를 범위로 설정하였습니다.

 

rng.AutoFilter 2, Range("e2")는 rng로 설정된 범위에 필터를 적용하되, 두 번째 열인 "B"열에 "E2셀"의 "서울"을 기준으로 필터를 적용하는 코드입니다. 만약 필터를 하고자 하는 열이 3번째 열이라면 2 대진 3을 적용시켜 주면 됩니다. 다만 열이 변경된다면 필터의 기준도 변경되어야 하기 때문에 "E2셀"의 기준 데이터도 함께 변경되어야 합니다.

 

 

동일한 예제를 가지고 한 가지 기능을 추가시켜 보겠습니다.

&lt;필터 해제&gt;
<필터 해제>

 

 

위 이미지상에 나와있는 코드를 자세히 살펴보시면 조금 달라진 코드를 발견할 수 있습니다. 해당 워크시트에 필터가 걸려있는지, 걸려있지 않은지를 확인하여 필터가 걸려있는 경우라면 필터를 해제하여 모든 데이터를 보여줄 수 있게 해주는 코드가 추가되었습니다. 

 

 

세부 내용은 코드를 살펴보면서 설명드리도록 하겠습니다.

기존 설명이 완료된 코드에 대한 설명은 생략하겠습니다.

 

Sub 필터()

Dim sh As Worksheet, rng As Range
' sh라는 변수를 통해 워크시트 개체를 넣어줍니다.

Set sh = Sheets("필터")
' "필터"라는 명칭의 워크시트를 sh 변수에 담아줍니다.

Set rng = Range("a1").CurrentRegion


If sh.AutoFilterMode = False Then rng.AutoFilter
' 필터모드가 적용되어 있지 않다면 필터모드를 적용해 줍니다.

If sh.FilterMode Then sh.ShowAllData

' 필터가 적용되어 있다면 필터를 해제하여 전체 데이터를 보여줍니다.

rng.AutoFilter 2, Range("e2")
rng.SpecialCells(xlCellTypeVisible).Copy Range("a22")
' rng범위 중 화면에 보이는 데이터들만 복사하여 "a22"셀에 붙여넣습니다.

End Sub

 

"필터"로 이름이 부여된 워크시트에 필터여부를 확인하기 위해 Dim sh As Worksheet를 추가하여 변수를 선언해 줍니다.

sh로 선언된 변수에는 Sheets("필터")를 반영하여 "필터" 워크시트에서 작업이 진행되도록 설정하였습니다.

 

If sh.AutoFilterMode = False Then rng.AutoFilter는 "필터" 워크시트 상에 필터모드 적용여부를 확인하는 코드입니다.

만약 필터모드가 적용되어 있지 않다면 필터모드를 적용시켜 주게 됩니다.

 

여기서 필터모드라고 함은 필터의 기준을 정할 수 있도록 하는 ▼모양의 버튼을 의미합니다. 

아래 이미지의 빨간 박스를 참고하시기 바랍니다.

 

&lt;필터모드&gt;
<필터모드>

 

If sh.FilterMode Then sh.ShowAllData는 sh개체 내에 필터가 되어 있다면 모든 데이터를 보여주라는 코드입니다.

쉽게 말해 필터를 해제하라는 말과 같은 것입니다.

 

여기까지 코드가 진행되면 어떤 모습일까요?

네. 맞습니다. 처음 예시를 들었던 모습으로 돌아오게 됩니다.

 

&lt;코드 진행 상태&gt;
<코드 진행 상태>

 

그 후에는 rng.AutoFilter 2, Range("e2")를 사용하여 장소가 "서울"인 데이터를 필터 하게 되며, rng.SpecialCells(xlCellTypeVisible).Copy Range("a22")를 이용하여  "a22"셀에 필터 된 데이터만 복사하여 붙여 넣는 코드가 완성되었습니다.

 

 

필터 조건이 없을때 메시지박스로 안내 후 프로시져 종료하기

 

데이터 관리를 하다보면 조건을 만족하는 데이터가 없는 경우가 있을 수 있습니다.

기본틀은 그대로 유지한 상태에서 조건이 없는 경우에 메시지박스를 통해 안내 후 프로시져를 종료하는 코드를 만들어 보겠습니다. 기존 사용된 코드에서 추가로 사용된 코드만 빨간색 글자로 처리 후 설명드리도록 하겠습니다.

Sub 필터()

Dim sh As Worksheet, rng As Range


Set sh = Sheets("필터")
Set rng = Range("a1").CurrentRegion

If sh.AutoFilterMode = False Then rng.AutoFilter
If sh.FilterMode Then sh.ShowAllData

rng.AutoFilter 2, Range("e2")
Range("a22").CurrentRegion.Clear
' "a22"셀부터 연속된 범위에 있는 데이터를 삭제합니다.



If rng.SpecialCells(xlCellTypeVisible).Count = 3 Then
' 만약 화편에 보이는 셀의 갯수가 3개일 경우에는 

    MsgBox "조건의 데이터가 없음"
       ' 메시지박스를 통해 데이터가 없음을 알려줍니다.

    If sh.FilterMode Then sh.ShowAllData
    Exit Sub
       ' 메시지박스과 필터모드가 해제되면 프로시져가 종료됩니다.

End If


rng.SpecialCells(xlCellTypeVisible).Copy Range("a22")


End Sub

 

필터 조건에 리스트에 없는 "지방"이라는 값을 아래와 같이 넣은 후 코드를 돌려 보겠습니다.

 

&lt;예시&gt;
<예시>

 

조건에 맞는 데이터가 없기 때문에 결과는 다음과 같이 나오는 것을 확인할 수 있습니다.

 

&lt;최종 결과&gt;
<최종 결과>

 

그럼 사용된 코드를 하나씩 살펴보겠습니다. 위에서도 말씀드렸다시피 새롭게 추가된 코드만 붉은색으로 표시하였으며, 해당 코드만 설명드리도록 하겠습니다.

 

Range("a22").CurrentRegion.Clear는 기존에 필터 된 데이터의 값이 복사되어 값으로 붙여진 범위에 값을 삭제하는 코드입니다. 해당 코드는 앞쪽 포스팅에서 다루었으니, 지나가도록 하겠습니다.

 

&lt;count = 3&gt;
<count = 3>

 

If rng.SpecialCells(xlCellTypeVisible).Count = 3 Then는 필터 후 rng범위 내에서 화면에 보이는 셀의 수가 3개 일 때를 의미합니다. 1행에 있는 분류제목만 카운팅 하면 3개라는 것을 알 수 있는데요. 즉, 조건에 맞는 데이터가 하나도 나오지 않는 경우를 찾는 코드입니다. 

 

&lt;메시지박스 출력&gt;
<메시지박스 출력>

 

조건에 맞는 데이터가 없다면 MsgBox "조건의 데이터가 없음"를 통해 메시지박스로 해당 내용을 알려준 후 Exit Sub를 통해 프로시저를 종료하게 됩니다.

 

중간에 If sh.FilterMode Then sh.ShowAllData를 넣어준 이유는 조건에 맞는 데이터가 없을때 필터를 해제한 후 프로시저를 종료하기 위함이니, 불필요하다고 느끼실 경우에는 삭제 후 코드를 작성하여도 무방합니다. 프로시저가 완료되면 처음 시작하였던 형태의 데이터의 모습으로 돌아가며 종료됩니다.

 

&lt;처음 모습으로 되돌아온 모습&gt;
<처음 모습으로 되돌아온 모습>

 


마치며,

지금까지 VBA를 사용하여 로우데이터에 필터를 적용하는 방법에 대해서 알아보았습니다. 간단한 작업의 경우는 엑셀상에서 직접 필터를 적용하는 것이 훨씬 빠를 수 있습니다만, 루틴업무에 적용시키기 위해서는 VBA를 사용하는 것이 훨씬 효율적이기 때문에 시간과 정성을 투자하는 것입니다.

 

이러한 루틴업무를 단축시키는 작업을 하나씩 진행해 나간다면 업무스킬의 향상은 물론 더 많은 업무를 빠르고 정확하게 처리할 수 있는 능력이 생기게 될 것입니다. 엑셀은 기술이 아닌 기능입니다. 반복연습만 하여도 충분히 효율적인 사용이 가능하다는 점을 기억하시고 반복연습을 진행해 보시기 바랍니다.

 

 

▼▼▼함께 읽으면 좋은 글▼▼▼

 

VBA 반복문 1탄(for~next 사용하기)

『 오늘은 VBA 반복문에 대해 알아보려고 하는데요. 반복문은 반복적인 작업을 대신해주는 만능키라고 할 수 있어요. 반복문은 지정한 횟수만큼, 혹은 무한으로 사용된 코드를 반복하게 만들어

lst914.tistory.com

 

VBA 반복문 2탄(For each ~ Next 사용하기)

『 For ~ next문과 For each ~ next문만 자유롭게 사용가능하다면 업무자동화에 한 발짝 더 다가섰다고 할 수 있습니다. 그만큼 사용빈도가 높고 중요한 내용이라고 할 수 있습니다. 업무자동화를 위해

lst914.tistory.com

 

 

VBA 빈셀 채우기!(피벗테이블 오류 최소화 방법)

『 피벗테이블을 사용할 때 가장 주의하여야 할 점은 셀병합으로 인해 숫자가 누락되는 것입니다. 또한 합계가 되는 기준셀의 명칭이 없게 되면 우리가 원하는 값에 도달할 수 없다는 것이죠.

lst914.tistory.com

 

 

VBA로 셀병합 해제 후 빈셀 채우기(빈셀 채우기와 찰떡궁합!)

『 병합되어 있는 표는 피벗테이블을 사용할 때 오류 발생이 높은 형태로 알려져 있습니다. 오류를 최소화하기 위해서는 셀병합은 되도록이면 사용하지 않는 습관을 들이는 것이 가장 좋을 것

lst914.tistory.com

 

 

VBA 워크시트함수(Match, Min함수), Split함수 사용법 익히기

『VBA에서도 엑셀에서 사용하던 함수를 사용할 수 있다는 것을 알고 계신가요? 엑셀의 기본함수를 VBA에서 사용이 가능하기 때문에 활용면에서 엄청난 시너지를 낼 수 있는데요. 빈번히 사용되는

lst914.tistory.com

 

 

고생 끝에 낙이 온다.

댓글