배열을 정렬하는 VBA 명령문 :: SortArray 함수
구문
SortArray ( 배열, [정렬방향], [숫자기준정렬] )
설명
엑셀 SortArray 함수는 배열을 오름차순 또는 내림차순으로 정렬하는 함수입니다. SortArray 함수를 사용할 시, 함수의 세번째 인수인 NumericSort 인수 설정을 주의해야 합니다. (기본값: 'True')
예를들어 {1, 3, 2, 11} 의 배열을 각 숫자와 텍스트 형식으로 정렬하면 아래와 같습니다.
- '숫자 형식'으로 정렬 : {1, 2, 3, 11} '// NumericSort가 True일 경우 숫자의 크기를 기준으로 정렬됩니다.
- '텍스트 형식'으로 정렬 : {1, 11, 2, 3} '// 숫자만 입력된 배열을 텍스트 형식으로 정렬할 경우 옳지않은 순서로 정렬됩니다.
또한 NumericFileter를 True로 입력하더라도, 배열에 '텍스트'가 포함된 값이 하나라도 있으면 자동으로 False처리가 되니 주의합니다.
- '숫자형식'으로 정렬 가능 : {1, 11, 3, 12, 2} => {1, 2, 3, 11, 12}
- '텍스트형식'으로 강제 정렬 : {1, 11, 3월, 12, 2} => {1, 11, 12, 2, 3월} '// 중간에 텍스트가 포함되어 '숫자형식'으로 정렬 불가능
2차원 배열을 정렬해야 할 경우 Sort2DArray 명령문을 사용합니다. Sort2DArray 함수의 전체 명령문과 자세한 사용법은 아래 관련 포스트를 참고하세요.
인수 설명
인수 | 데이터형식 |
vaArr [Variant] |
정렬할 배열입니다. |
SortOrder [xlSortOrder] |
정렬방향입니다. (오름차순 또는 내림차순) 기본값은 오름차순입니다. |
NumericSort [Boolean] |
True일경우 숫자형식(크기)으로 정렬합니다. 기본값은 True 입니다. 단 배열에 텍스트값이 하나라도 있을경우 강제 False 처리 됩니다. |
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [VBA예제] SortArray 명령문예제파일
SortArray 함수 전체 코드
'############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '■ SortArray 명령문 '■ 배열을 오름차순/내림차순으로 정렬합니다. '■ 인수 설명 '_____________vaArr : 정렬할 배열입니다. '_____________SortOrder : 정렬방향입니다. (오름차순,내림차순) '_____________NumericSort : 숫자크기로 정렬할 여부를 결정합니다.(기본값 False, 텍스트형식 정렬) '■ 반환값 '_____________정렬된 배열을 반환합니다. '############################################################### Function SortArray(vaArr As Variant, Optional SortOrder As XlSortOrder = xlAscending, Optional NumericSort As Boolean = True) Dim i As Long: Dim j As Long Dim vaVal As Variant Dim Temp If NumericSort = True Then For Each vaVal In vaArr If IsNumeric(vaVal) = False Then NumericSort = False: Exit For Next End If If NumericSort = False Then If SortOrder = xlAscending Then For i = LBound(vaArr) To UBound(vaArr) - 1 For j = i + 1 To UBound(vaArr) If UCase(vaArr(i)) > UCase(vaArr(j)) Then Temp = vaArr(j) vaArr(j) = vaArr(i) vaArr(i) = Temp End If Next j Next i Else For i = LBound(vaArr) To UBound(vaArr) - 1 For j = i + 1 To UBound(vaArr) If UCase(vaArr(i)) < UCase(vaArr(j)) Then Temp = vaArr(j) vaArr(j) = vaArr(i) vaArr(i) = Temp End If Next j Next i End If Else If SortOrder = xlAscending Then For i = LBound(vaArr) To UBound(vaArr) - 1 For j = i + 1 To UBound(vaArr) If vaArr(i) > vaArr(j) Then Temp = vaArr(j) vaArr(j) = vaArr(i) vaArr(i) = Temp End If Next j Next i Else For i = LBound(vaArr) To UBound(vaArr) - 1 For j = i + 1 To UBound(vaArr) If vaArr(i) < vaArr(j) Then Temp = vaArr(j) vaArr(j) = vaArr(i) vaArr(i) = Temp End If Next j Next i End If End If SortArray = vaArr End Function
명령문 동작원리 단계별 알아보기
SortArray 함수는 배열의 '첫번째' 값을 시작으로 해당 값을 '고정'한 뒤, 이후 값들을 하나씩 비교하여 오름차순 또는 내림차순으로 정렬합니다.
즉, 첫번째 값을 고정한 채로 첫번째 싸이클을 돌게되면 해당 값은 '최소값' 또는 '최대값'이 놓이게 됩니다. 쉬운 이해를 위해 {5, 1, 7, 9, 3} 배열을 오름차순으로 정렬하는 것을 예제로 알아보겠습니다.
- 첫번째 값을 고정합니다. 두번째 값부터 하나씩 비교하여 가장 작은값이 첫번째로 오도록 정렬합니다.
= {5, 1, 7, 9, 3} '// 첫번째 값을 고정한 뒤, 두번째 값부터 하나씩 비교합니다. 1이 5보다 작으므로 1을 앞으로 보냅니다.
= {1, 5, 7, 9, 3}
= {1, 5, 7, 9, 3} '// 1을 앞으로 보낸 뒤, 이제 세번째값과 비교합니다. 1이 7보다 작으므로 넘어갑니다.
= {1, 5, 7, 9 3} .. '// 첫번째값과 네번째값을 비교합니다.첫번째 값을 고정한 뒤, 두번째 값부터 하나씩 비교하여 정렬합니다. - 첫번째 값이 확정됩니다. 이제 두번째 값을 고정한 뒤, 이후 값을 하나씩 비교합니다.
={1, 5, 7, 9, 3} '// 두번째값과 세번째값을 비교합니다. 5가 7보다 작으므로 넘어갑니다.
={1, 5, 7, 9, 3}
={1, 3, 7, 9, 5} '// 뒤에 있는 3이 5보다 작으므로 3을 앞으로 이동합니다.첫번째 값이 확정되었으면, 두번째 값을 고정한 뒤 같은 작업을 반복합니다. - 이제 첫번째와 두번째값이 확정되었습니다. 세번째 값을 고정한 뒤 같은 작업을 반복합니다.
세번째 값을 고정한 뒤 같은 작업을 반복합니다. - 오름차순으로 정렬된 배열이 반환됩니다.
= {1, 3, 5, 7, 9}
- 첫번째 값을 고정합니다. 두번째 값부터 하나씩 비교하여 가장 작은값이 첫번째로 오도록 정렬합니다.