VBA로 로우 데이터 정렬하기(1개의 기준으로 정렬, 2개이상의 기준으로 정렬)
『 엑셀작업을 할 때 가장 많이 시간이 소용되는 것은 데이터를 원하는 형태로 정리하는 것인데요. 주로 엑셀의 정렬기능을 이용하여 데이터를 가공하곤 합니다. 하지만 매번 바뀌는 로우데이터를 가지고 매번 정리해야 한다면 어떨까요? 똑같은 작업을 매번 똑같이 하는 것보다 자동화시킨다면 훨씬 더 일을 효율적으로 진행할 수 있겠죠. 오늘은 VBA를 통해 데이터를 정렬하는 방법에 대해 알아보도록 하겠습니다. 』
VBA로 로우 데이터 정렬하기
VBA 로우 데이터 정렬하기의 기본문법은 다음과 같습니다.
정렬범위.Sort 첫번째 정렬위치, xlDescending, 두번째 정렬위치, xlAscending, 정렬방향 |
기본문법을 살펴보면 첫 번째 정렬위치와 두 번째 정렬위치를 통해 여러개의 기준을 설정할 수 있습니다. 엑셀에서 데이터를 정렬할 때 날짜 데이터를 기준으로 내림차순 하고, 제품명을 기준으로 오름차순 정렬하는 것처럼 한 개 이상의 기준으로 데이터를 정렬할 수 있습니다. 기본적으로 VBA는 엑셀에서 일반적으로 사용되는 내용들을 똑같이 구현할 수 있기때문에 쉽게 배울 수 있다는 장점이 있습니다.
그럼 첫번째, 두 번째 기준에 대해 명확히 이해할 수 있도록 엑셀 데이터를 가지고 예를 들어보도록 하겠습니다.
아래의 예시를 살펴보시죠.
A열은 "일자"가, B열에는 "도시"가 입력된 데이터입니다. 엑셀 정렬기능을 통해 첫 번째 정렬기준을 "A열 오름차순"으로 설정하였고, 두 번째 정렬기준은 "B열 내림차순"으로 설정하였습니다. 정렬기능을 실행하게 되면 일자는 가장 빠른 순서대로, 도시는 내림차순인 하~가 순서대로 정렬이 되는 것을 확인할 수 있습니다.
다만, 여기서 주의깊게 살펴보아야 할 점은 "일자"가 "2023-02-14"로 동일하게 설정된 오사카, 서울, 베이징이 어떻게 정렬되는 것인가입니다. 결과를 한번 살펴보시죠.
날짜가 동일하기 때문에 두 번째 기준인 "하~가"를 토대로 오사카, 서울, 베이징 순으로 정렬된 것을 확인할 수 있습니다.
정렬기준은 두개가 아닌 그 이상도 가능하기 때문에 상황에 맞게 설정하여 사용하시면 좋습니다.
엑셀에서 사용하였던 정렬기능을 VBA를 통해 구현해 보도록 하겠습니다. 코드는 아래와 같습니다.
Sub 정렬() Dim rng As Range Set rng = Range("a4", Cells(Rows.Count, "d").End(xlUp)) ' 정렬할 범위를 rng변수로 담아줍니다. Sheets("정렬").Sort.SortFields.Clear ' 사용자 정의로 설정된 정렬기준을 제거하는 역할을 합니다. rng.Sort rng(1, 1) ' rng의 범위에서 rng범위 중 첫번째 열을 기준으로 정렬합니다. ' 오름차순의 경우는 생략이 가능하며, 내림차순의 경우에는 xldescending을 추가해 줍니다. End Sub |
Set rng = Range("a4", Cells(Rows.Count, "d").End(xlUp))은 범위를 변수로 설정한다는 내용입니다. A4열부터 "D"열의 데이터가 있는 마지막 행까지의 범위를 설정합니다. 이 방법은 앞에서도 무수히 다루었기 때문에 바로 넘어가도록 하겠습니다.
Sheets("정렬").Sort.SortFields.Clear의 경우는 위에서 살펴보지 않았던 기능입니다만, 정렬을 할 때마다 적용시켜 주는 것이 좋습니다. 이유를 한번 살펴보도록 하겠습니다.
위 이미지는 데이터를 정렬기준을 설정하여 정렬한 형태입니다. 정렬 기준을 새롭게 정의하고자 할 경우에는 기존에 설정된 정렬기준을 삭제해주고 다시금 기준을 설정해야 하는데요. 바로 Sheets("정렬"). Sort.SortFields.Clear를 통해 기존의 정렬기준을 초기화시켜 줄 수 있습니다. Sheets("정렬").Sort.SortFields.Clear를 통해 초기화시켜 보겠습니다.
정렬기준 삭제가 완료된 모습입니다. 정렬기준 "A열"과 두 번째 정렬기준 "B열"이 삭제되고 정렬기준에 빈칸으로 남아있는 것을 확인할 수 있습니다. 만약 정렬 초기화를 시키지 않는다면 기존 정렬기준이 데이터에 영향을 미칠 수 있기 때문에 원하지 않는 정렬이 이루어질 수 있습니다.
정렬기준 초기화가 완료되었다면 rng.Sort rng(1, 1)을 통해 새롭게 정렬기준을 설정하여 줍니다. rng는 설정된 범위이며, rng(1,1)은 설정된 범위에서 1열을 기준으로 정렬한다는 것을 의미합니다. 여기서 주의하여야 할 점은 내림차순의 경우에는 xldescending을 입력하여야 하며, 오름차순의 경우는 생략이 가능하다는 것입니다.
내림차순 정렬을 위해서는 rng.Sort rng(1, 1), xldescending으로 표현할 수 있습니다.
해당 프로시져를 실행해 보면 "일자"를 기준으로 정렬되는 것을 확인할 수 있습니다.
2개 이상의 기준으로 정렬하기
1개의 기준으로 정렬하는 방법이 익숙해졌다면 기준을 한 개 더 추가하여 프로시저를 구축해 보도록 하겠습니다.
사실 기준이 2개이던, 그 이상이든 간에 VBA에 기준만 추가해 주면 되는 것이기 때문에 해당 방법만 알고 계신다면 기준의 개수와 관계없이 자유자재로 사용이 가능하게 될 것입니다.
2개 이상을 정렬하는 코드는 다음과 같습니다.
Sub 재정렬() Dim rng As Range Set rng = Range("a4", Cells(Rows.Count, "d").End(xlUp)) ' 정렬 범위 설정 Sheets("재정렬").Sort.SortFields.Clear ' 사용자 지정기준 삭제 rng.Sort rng(1, 1), xlDescending, rng(1, 2), , xlAscending, Orientation:=xlSortColumns ' 2개의 정렬기준을 설정, Orientation:=xlSortColumns을 통해 정렬의 방향을 정해줍니다. End Sub |
위에서 이미 1개의 정렬기준을 사용해 보았기 때문에 크게 어려운 점은 없습니다.
Set rng = Range("a4", Cells(Rows.Count, "d").End(xlUp))은 범위를 변수로 설정한다는 내용이며, Sheets("재정렬").Sort.SortFields.Clear는 정렬기준을 초기화하는 방법이라고 이미 설명드린 바 있습니다.
주의 깊게 보아야 할 것 rng.Sort rng(1, 1), xlDescending, rng(1, 2), , xlAscending, Orientation:=xlSortColumns 부분입니다. 위 코드를 조금만 쪼개서 보면 쉽게 이해가 가능하시 텐데요.
① rng.Sort rng(1, 1), xlDescending는 설정된 범위 내에서 1열 내림차순 정렬의 기준을 입력한 것입니다.
② rng(1, 2), , xlAscending는 설정된 범위 내에서 2열 오름차순 정렬의 기준을 입력하였습니다.
여기서 주의할점은 xlAscending앞에 " "칸입니다. 스크린팁을 통해 확인해 보면 type이라는 인수를 넣게 되어 있는데 이는 피벗테이블과 연관이 있는 부분이기때문에 무시하고 콤마를 이용하여 넘어가 주어야 합니다.
③ Orientation:=xlSortColumns는 정렬방향을 Columns으로 정렬할 것인지, Row로 정렬할 것인지를 결정합니다.
일반적으로 사용되는 로우데이터는 열 방향으로 정렬하기 때문에 Row로 정렬할 일은 크게 없습니다.
만약 Orientation을 Row로 설정하여 내림차순 정렬한다면 점수가 가장 높은 6학년의 점수부터 정렬되는 것을 확인할 수 있습니다.
실제로 로우데이터를 가로정렬로 적용할 일은 많지 않기 때문에 Orientation:=xlSortColumns만 사용된다고 보아도 무방합니다. 두 개 이상의 정렬기준을 설정할 때는 스크린팁이 나오기 때문에 순서와 스펠링을 알지 못하더라도 스크린팁을 따라서 작성하면 어렵지 않게 VBA를 통한 정렬을 사용할 수 있게 됩니다.
2개 이상 기준정렬의 결과를 살펴보겠습니다.
1열은 내림차순 기준으로 정렬되었으며, 2열은 오름차순 기준으로 정렬되었습니다.
일자가 같은 2023-02-14일을 살펴보면 가-하의 오름차순인 베이징, 서울, 오사카 순으로 정렬이 되었습니다.
마치며
지금까지 VBA를 사용하여 로우데이터를 정렬하는 방법에 대해서 알아보았습니다. 간단하게 엑셀의 정렬기능을 이용하면 빠르게 끝날 것을 왜 VBA를 적용하여 시간을 낭비하는지 모르겠다고 생각하시는 분들도 분명 계실 거라 생각합니다. 하지만 당장은 시간적 손해가 있을 수 있지만 루틴업무에 VBA를 적용시키면 시간을 훤씬 단축시킬 수 있는 장점이 있습니다. 이러한 루틴업무를 단축시키면 훨씬 더 많은 것들을 효율적으로 할 수 있는 시간이 생깁니다.
시간적 여유를 만들기 위한 시간을 투자한 것이라고 생각하면서 내 것이 될 때까지 반복 또 반복하시기 바랍니다.
▼▼▼함께 읽으면 좋은 글▼▼▼
자동화를 구축하는 시간을 오래 걸릴 수 있으나, 구축만 된다면 퇴근시간은 훨씬 빨라질 수 있다.
댓글