VBA 유튜브 학습기 16 - Sort! 두 가지 기준 이상으로 설정한 조건에 맞게 데이터 정렬하기(오름차순, 내림차순 등)
엑사남 님 강의 16강 듣고 왔습니다.
요즘 다른 데 정신이 팔려서(이직, 파워 BI, 안성탕면, 파이썬 등) 오랜만에 강의를 들었네요.
며칠 뒤면 까먹고 사경을 헤맬 미래의 저를 위해 정리해 봅니다.
16강은 데이터를 기준에 맞춰 정렬하는 VBA에 관한 내용입니다.
단순히 오름차순, 내림차순은 엑셀에서 버튼 한 번 클릭해서 해결할 수 있는데...
다중 조건(어떤 열을 기준으로 오름차순 정렬한 후에 또 다른 열을 기준으로 내림차순한다든가)으로 정렬해야 할 경우엔 일이 조금 복잡해지죠.
저런 복잡한 작업도 VBA 코드는 생각보다 간단하더라고요.
정렬할 데이터 원본입니다.
이 데이터를 세 가지 방법으로 정렬을 해 보는데요.
1. 반 기준으로 1, 2, 3반 순서로 오름차순으로 정렬
2. 반 기준으로 3, 2, 1반 순서로 내림차순으로 정렬
3. 반 기준으로 오름차순 정렬하고 해당 반 데이터를 평균을 기준으로 내림차순으로 정렬
이렇게 정렬해 볼 겁니다.
먼저 Alt + F11 눌러 VBA 편집 창을 켜 주고요.
엑셀 시트명 클릭 후 마우스 오른쪽 버튼 클릭 - [삽입] - [모듈] 을 순서대로 클릭합니다.
VBA 코드를 작성할 수 있는 창이 뜰 텐데요.
코드를 작성하기 전에!
원본 데이터를 한 번 확인해 봅니다.
데이터 범위에 제목 행(12행)을 포함할 건지를 결정해야 하는데요.
엑사남 님과 함께 한 강의에서는 제목 행을 제외한 데이터만 범위로 잡고 코드를 작성합니다.
즉, L12 셀부터 R32셀까지.
순수하게 데이터가 입력된 범위만 잡고 코드를 작성할게요.
Sub sort_test()
Dim rngD As Range
Set rngD = Range("L13:R" & Range("B2"))
rngD.Sort Range("M13"), xlAscending, Header:=xlNo
End Sub
Set rngD = Range("L13:R" & Range("B2"))
'rngD라는 범위는 L13 셀부터 R열의 B2셀이 가르키는 행까지를 범위로 한다.
매번 반복되는 마지막 행 설정 방법은 이제 생략할게요.
모르시는 분들은 여기를 참고해 주세요~
VBA 유튜브 학습기 5 - 데이터의 마지막 행과 열 자동으로 찾기 (feat. 파워 문과 기획자)
데이터가 입력된 마지막 행과 열을 자동으로 찾아서, 매번 코드를 수정하지 않아도 자동으로 조건에 맞는 값에 표시를 해 주는 방법이라니. 주제부터 흥미로워.🤩 엑사남 님 강의 5강 듣고 왔습
funnyatoz.tistory.com
rngD.Sort Range("M13"), xlAscending, Header:=xlNo
'rngD 범위를 정렬할 건데(Sort) M13셀의 열을 기준으로 오름차순으로 정렬(xlAscending)한다. 단, rngD의 범위는 제목 행은 포함하지 않는다.(Header:=xlNo)
[정렬 방식을 의미하는 VBA 코드들]
* xlAscending : 오름차순 정렬
* xlDescending : 내림차순 정렬
[제목 행의 포함 여부를 결정하는 VBA 코드들]
* xlGuess : 헤더 설정을 엑셀이 알아서 설정
* xlYes : 데이터의 첫 번째 행을 제목 행으로 사용
* xlNo : 데이터의 첫 번째 행을 제목 행으로 사용하지 않음
코드를 작성한 후에 실행해 보면
이렇게 반을 기준으로 오름차순으로 정렬이 됩니다.
오름차순을 해 봤으니까 이제 내림차순으로 정렬해 봅니다.
오름차순 정렬 코드에서 하나만 바꿔 주면 되겠죠?
Sub sort_test()
Dim rngD As Range
Set rngD = Range("L13:R" & Range("B2"))
rngD.Sort Range("M13"), xlDescending, Header:=xlNo
End Sub
xlAscending만 xlDescending으로 바꾼 후에 실행해 보면.
이렇게 반을 기준으로 내림차순으로 정렬됩니다.
이제 오늘 강이 내용의 꽃🌷🌼💐
다중 조건으로 정렬해 볼 텐데요.
정렬에 앞서 코드가 길어졌을 때 알아 보기 쉽도록 코드를 좀 다듬어 줍니다.
Sub sort_test()
Dim rngD As Range
Set rngD = Range("L13:R" & Range("B2"))
rngD.Sort key1:=Range("M13"), order1:=xlDescending, Header:=xlNo
End Sub
rngD.Sort Key1:=Range("M13"), order1:=xlDescending, Header:=No
'rngD를 정렬할 건데. Key1(조건1)은 M13 셀의 열을 기준으로 하고, 실행은(order1) 내림차순으로 한다.
이렇게 조건1은 무엇, 실행1은 무엇.
이런 식으로 보기 좋게 정리를해 주고요.
이제 본격적으로!
반을 기준으로 오름차순 정렬하고, 해당 반의 데이터들은 평균을 기준으로 내림차순하도록
코드를 수정, 추가해 볼게요.
Sub sort_test()
Dim rngD As Range
Set rngD = Range("L13:R" & Range("B2"))
rngD.Sort key1:=Range("M13"), order1:=xlAscending, _
key2:=Range("R13"), order2:=xlDescending, Header:=xlNo
End Sub
key와 order로 코드를 정리해 준 게 여기서 빛을 발합니다.
rngD.Sort Key1:=Range("M13"), order1:=xlAscending. _
Key2:=Range("R13"), order2:=xlDescending, Header:=xlNo
'조건1(key1) : M13 셀의 열을 기준으로, 실행1(order1) : 오름차순 정렬한다.
조건2(key2) : R13셀의 열을 기준으로, 실행2(order2) : 내림차순 정렬한다.
rngD의 범위는 제목 행은 포함하지 않는다. (Header:=xlNo)
* 코드가 길어서 한 줄 내려서 작성할 때는 한 칸 띄고 _ (언더바) 사용하면 됩니다.
작성된 코드를 실행해 보면
이렇게 반을 기준으로는 오름차순 정렬을 하고.
같은 반끼리의 데이터는 평균을 기준으로 내림차순 정렬된 걸 확인할 수 있습니다.
16강의 내용은 간단하면서도 실무에서 자주 사용하는 내용이었어요.
16강의 과제도 있었는데요.
과제를 한 내용까지 올리니까 포스팅이 너무 길어져서 과제는 이제 따로 올리지 않고 제 스스로 알아서 열심히 해 보려고요~ 과연....🤥 ㅋㅋㅋ
전 17강 듣고 오겠습니다~