- 최초 작성일: 2017-09-23
- 최종 수정일: 2026-09-30
- 조회수: 27 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 239회 - 시트 정렬하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
시트가 많아지면 원하는 순서로 정렬해 두고 싶을 때가 있습니다. 이번 시간에는 버블소트 알고리즘부터 사용자 지정 순서, 탭 색상 기준까지 다양한 방식으로 시트를 정렬하는 VBA 코드를 알아보겠습니다.
다양한 방식으로 시트 정렬하기
핵심 요약: 네 가지 방식으로 시트 정렬하기
워크시트를 정렬하는 방법은 한 가지가 아닙니다. Worksheets.Move 메서드를 기준으로 버블소트, 이름순, 사용자 지정 순서, 탭 색상순 네 가지 방식을 코드로 구현했습니다.
- SortSheetByBubbleSort: 시트 이름 배열을 버블소트로 정렬하며 시트도 함께 이동
- SortSheetsByName: 중첩 For 문으로 이름순 정렬
- SortSheetByUserOrder: 이름 정의된 범위(Start)에 나열한 순서대로 정렬
- SortSheetByTabColor: Tab.ColorIndex 값을 비교해 탭 색상순 정렬
버블 소트 알고리즘으로 시트 정렬하기
시트를 정렬하는 데에는 여러 가지 방법이 있습니다. 흔한 방법 중 하나가 '버블소트 알고리즘'을 이용하는 것입니다. 인접한 두 개의 값을 비교해서 순서가 맞지 않으면 자리를 바꾸는 과정을, 마치 3개의 공을 가지고 저글링하듯 전체를 훑으며 반복하는 방식입니다.
이 과정을 엑셀이 알아듣게 코딩하면 아래와 같은 형태가 됩니다. 시트 이름을 배열 변수에 담아 두고, 인접한 이름끼리 비교해 순서가 맞지 않으면 배열 값을 바꾸는 동시에 실제 시트도 Worksheets.Move로 옮깁니다.
Sub SortSheetByBubbleSort()
Dim i As Integer
Dim j As Integer
Dim strTemp As String
Dim strSheetName() As String
i = Worksheets.Count
ReDim strSheetName(i)
For i = 1 To UBound(strSheetName())
strSheetName(i) = Worksheets(i).Name
Next i
For i = UBound(strSheetName()) - 1 To 1 Step -1
For j = 1 To i
If strSheetName(j) > strSheetName(j + 1) Then
strTemp = strSheetName(j)
strSheetName(j) = strSheetName(j + 1)
strSheetName(j + 1) = strTemp
Worksheets(strTemp).Move after:=Worksheets(strSheetName(j))
End If
Next j
Next i
Application.Goto Sheets("Preface").Range("A1"), True
End Sub
중첩 For ~ Next 문으로 정렬하기
그런가 하면, 중첩 For ~ Next 문을 이용하여 해결할 수도 있습니다. 코드는 따로 설명하고 말고 할 것도 없을 정도로 간단합니다.
Sub SortSheetsByName()
Dim i As Integer
Dim j As Integer
Dim intNum As Integer
intNum = Sheets.Count
For i = 1 To intNum
For j = 1 To i - 1
If Sheets(j).Name > Sheets(i).Name Then _
Sheets(i).Move Before:=Sheets(j)
Next j
Next i
End Sub
사용자가 지정한 순서로 정렬하기
그런데 시트를 '가나다' 순서가 아니라 사용자가 지정하는 순서로 정렬하려면 어떻게 해야 할까요? 예를 들어 강동, 강서, 강남, 강북, 부산, 대구, 대전, 광주, 제주 순서로 정렬되어야 한다면 말이지요.
시트 정렬하는 과정을 제대로 이해했다면 조금만 응용하면 됩니다. 원하는 순서대로 시트 이름을 셀에 나열해 두고(예제에서는 'Start'라는 이름으로 정의된 영역), 그 순서대로 시트를 맨 앞부터 차례로 옮기면 됩니다.
Sub SortSheetByUserOrder()
Dim rngTarget As Range
Dim rngCell As Range
Dim i As Integer
Dim strTemp As String
Set rngTarget = Range("Start").CurrentRegion.Cells
For Each rngCell In rngTarget
i = i + 1
strTemp = rngCell
Sheets(strTemp).Move Before:=Sheets(i)
Next rngCell
End Sub
탭 색을 기준으로 정렬하기
하나 더 해 볼까요? 엑셀 2007 버전부터는 시트 탭에 색상을 지정할 수 있습니다. 따라서 탭 색을 기준으로 정렬할 수도 있습니다.
Sub SortSheetByTabColor()
Dim i As Integer
Dim j As Integer
Dim intNum As Integer
intNum = Sheets.Count
For i = 1 To intNum
For j = 1 To i - 1
If Sheets(j).Tab.ColorIndex > Sheets(i).Tab.ColorIndex Then _
Sheets(i).Move Before:=Sheets(j)
Next j
Next i
End Sub
참고: Tab.ColorIndex
Sheets(n).Tab.ColorIndex로 시트 탭의 색상 인덱스 값을 가져올 수 있습니다. 이 값을 비교해서 Sheets(i).Move Before:=Sheets(j)로 시트 위치를 바꾸면 탭 색 순서대로 정렬됩니다.
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 코드와 사용 방법은 원문 그대로입니다.
이것 말고도 얼마든지 다른 방법으로 시트를 정렬할 수 있습니다. 늘 그렇듯, 응용은 여러분들 몫으로 남깁니다.
정리 — 네 가지 시트 정렬 프로시저
| 프로시저 | 정렬 기준 |
|---|---|
| SortSheetByBubbleSort | 버블소트 알고리즘으로 시트 이름 오름차순 정렬 |
| SortSheetsByName | 중첩 For 문으로 시트 이름 오름차순 정렬 |
| SortSheetByUserOrder | 'Start'로 이름 정의된 범위에 나열한 사용자 지정 순서 |
| SortSheetByTabColor | 시트 탭의 Tab.ColorIndex 값 순서 |
자주 묻는 질문 (FAQ)
Q1. 내림차순으로 정렬하려면 어떻게 하나요?
각 프로시저의 비교 연산자(> 또는 <)의 방향을 반대로 바꾸면 내림차순으로 정렬됩니다.
Q2. SortSheetByUserOrder의 'Start' 이름은 어떻게 정의하나요?
원하는 정렬 순서대로 시트 이름을 세로로 나열한 셀 범위를 선택한 뒤, 이름 상자에 Start를 입력하고 Enter를 누르면 이름이 정의됩니다.
Q3. 시트 개수가 매우 많을 때 어떤 방식이 더 효율적인가요?
버블소트는 시트 수가 많아질수록 비교 횟수가 급격히 늘어나므로, 시트가 아주 많다면 중첩 For 문 방식(SortSheetsByName)이나 필요한 순서를 직접 지정하는 SortSheetByUserOrder가 더 다루기 쉽습니다.
마치며
시트를 정렬하는 방법은 이 네 가지 말고도 얼마든지 더 있을 수 있습니다. 코드의 원리를 이해했다면, 여러분만의 기준으로 또 다른 정렬 방식을 만들어 보세요!