엑셀 목차 만들기 자동화, CreateTOC 함수 사용법
시트를 자동으로 정렬/분류한 뒤 목차를 생성하는 CreateTOC 명령문
이 강의에서는 시트 수가 많은 통합문서에서 목차 시트를 자동으로 생성하는 CreateTOC 매크로의 사용법을 다룹니다. 시트를 오름차순이나 내림차순으로 정렬한 뒤 자리수나 특정 기호를 기준으로 그룹화하고, 각 시트에 [목차로 돌아가기] 버튼까지 자동으로 배치하는 단계를 정리해 반복적인 시트 관리 작업을 줄이는 방법을 알아봅니다.
관련 자료를 모았어요
더 깊이 살펴볼 수 있는 자료를 한곳에
실습 가이드
목차 만들기 프로그램을 사용하면 다음과 같이 편리합니다.
- 시트를 오름차순 또는 내림차순으로 자동 정렬한 뒤 목차를 생성합니다. 따라서 시트 순서를 미리 정리하지 않아도 깔끔한 목차를 만들 수 있습니다.
- 입력한 기준에 따라 목차를 그룹화할 수 있습니다. 자리수 또는 특정 기호를 기준으로 시트를 자동으로 묶어줍니다.
- 시트가 많아 시트 간 이동이 번거로울 때, [목차로 돌아가기] 버튼을 각 시트에 자동으로 생성할 수 있습니다.
오빠두Tip : 매크로 없이 함수 복사/붙여넣기만으로 목차를 만드는 방법은 아래 영상강의를 참고하세요.
추가기능 사용법
- 추가기능을 설치하면 엑셀 상단에 [삽입] - [DuTool] - [목차만들기] 버튼이 추가됩니다.

- [목차생성] 버튼을 클릭하면 목차만들기 설정창이 나타납니다.

- 설정창에는 [목차 그룹화]와 [돌아가기 버튼] 두 개의 체크박스가 있습니다.

- [목차 그룹화]를 체크하면 목차를 오름차순 또는 내림차순으로 정렬할 수 있습니다.

- 분류별로 시트를 묶어주려면 '묶을 기준'을 입력합니다. 묶을 기준은 '숫자' 또는 '특정 기호/문자'로 입력할 수 있습니다.
1. 숫자를 입력할 경우: 입력한 자리수를 기준으로 목차를 분류합니다. (자리수 고정)
2. 기호를 입력할 경우: 시트 이름에서 해당 기호를 찾아 그 위치를 기준으로 목차를 분류합니다.
- 그룹화 없이 시트 정렬만 원할 경우, 묶을 기준을 비워두고 다음 단계로 넘어갑니다.

- [돌아가기 버튼]을 체크하면 '목차로 돌아가기' 링크를 각 시트에 자동 생성할 수 있습니다. 기본 위치는 A1셀입니다.

- [미리보기] 버튼을 클릭하면 생성될 목차를 사전에 확인할 수 있습니다.

- 목차 목록이 의도와 일치하면 [목차생성] 버튼을 클릭합니다. [목차] 시트가 통합문서의 가장 왼쪽 첫 번째 시트로 추가됩니다.

- 엑셀은 동일한 이름의 시트를 두 개 이상 만들 수 없으므로, [목차]라는 이름의 시트가 이미 존재하면 현재 시간이 덧붙은 이름으로 시트가 생성됩니다.

이번 강의에서 사용된 보조 명령문 (SortArray 명령문)
이번 강의에서는 배열을 정렬하는 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
목차만들기 매크로의 단계별 동작 원리는 영상강의에서 자세히 설명합니다.
Sub CreateTOC(Optional SortByLength As Variant = "", Optional SortOrder As Long = 0, Optional returnBtn As Boolean = False, Optional BtnCell As String = "A1") Dim WB As Workbook: Dim WS As Worksheet: Dim tocWS As Worksheet Dim vaArr As Variant Dim i As Long: Dim x As Long: Dim j As Long: Dim jj As Long: x = 0: j = 0: jj = 1 Dim groupLen As Variant: Dim prefix As String: groupLen = 0 Application.ScreenUpdating = False Set WB = ActiveWorkbook Set tocWS = WB.Worksheets.Add(Before:=WB.Worksheets(1)) '임시 배열 생성 ReDim vaArr(0 To WB.Worksheets.Count - 2) For i = 2 To WB.Worksheets.Count vaArr(i - 2) = WB.Worksheets(i).Name Next If SortOrder = 1 Then vaArr = SortArray(vaArr, xlAscending) If SortOrder = -1 Then vaArr = SortArray(vaArr, xlDescending) tocWS.Activate ActiveWindow.DisplayGridlines = False With tocWS On Error GoTo shtexist .Name = "목차" resume_1: .Tab.Color = RGB(47, 47, 47) .Range("A:B").EntireColumn.ColumnWidth = 4 .Range("4:500").EntireRow.RowHeight = 20 .Range("2:2").Interior.Color = RGB(47, 47, 47) .Range("1:1").EntireRow.RowHeight = 11 With .Range("B2") .value = "목차" .Font.Bold = True .Font.Size = 18 .Font.Color = RGB(255, 255, 255) End With .Range("B4").value = "#" .Range("C4").value = "시트명" With .Range("B4").EntireRow .Font.Bold = True .Font.Color = RGB(255, 255, 255) .Interior.Color = RGB(89, 89, 89) End With For i = LBound(vaArr) To UBound(vaArr) If IsNumeric(SortByLength) = True Then groupLen = SortByLength Else If InStr(1, vaArr(i), SortByLength) > 0 Then groupLen = InStr(1, vaArr(i), SortByLength) - 1 End If On Error Resume Next If Left(vaArr(i - 1), groupLen) <> Left(vaArr(i), groupLen) Then If (i = LBound(vaArr) And SortOrder = 0) Then j = j + 1: jj = 1 Else j = j + 1: jj = 1 .Cells(x + 5, 2).value = j .Cells(x + 5, 3).value = Left(vaArr(i), groupLen) If .Cells(x + 5, 3).value = "" Then .Cells(x + 5, 3).value = "기타항목" .Cells(x + 5, 2).NumberFormat = "0*." .Cells(x + 5, 1).EntireRow.Font.Bold = True .Cells(x + 5, 1).EntireRow.Interior.Color = RGB(245, 245, 245) x = x + 1 End If On Error GoTo 0 Else jj = jj + 1 End If If blnSort = True Then prefix = "'" & j & "-" .Cells(x + 5, 2).value = prefix & jj .Cells(x + 5, 2).NumberFormat = "_~@" .Hyperlinks.Add anchor:=.Cells(x + 5, 3), Address:="", SubAddress:="'" & CStr(vaArr(i)) & "'!A1", TextToDisplay:=vaArr(i) .Cells(x + 5, 3).InsertIndent 1 x = x + 1 Next .Range("C:C").EntireColumn.AutoFit End With If returnBtn = True Then For i = 2 To WB.Worksheets.Count WB.Worksheets(i).Hyperlinks.Add anchor:=WB.Worksheets(i).Range(BtnCell), Address:="", SubAddress:=tocWS.Name & "!A1", TextToDisplay:="목차로 돌아가기" WB.Worksheets(i).Range(BtnCell).Font.Bold = True Next End If Application.ScreenUpdating = True Exit Sub shtexist: tocWS.Name = "목차" & Format(Now, "yyyymmddhhmmss") On Error GoTo 0 Resume resume_1 End Sub
CreateTOC 명령문
엑셀 목차만들기 매크로 CreateTOC 명령문의 인수 구성은 아래와 같습니다.
CreateTOC ( [분류기준], [정렬방향], [돌아가기링크생성], [링크위치] )
CreateTOC 명령문의 기본 사용 예시는 아래와 같습니다. 인수별 자세한 설명은 영상강의를 참고하세요.
'1. 통합문서 시트 순서 그대로 목차를 생성
CreateTOC
'2. 시트를 오름차순으로 정렬한 뒤 목차 생성
CreateTOC SortOrder:=1
'3. 시트를 오름차순으로 정렬한 뒤, "-" 기호를 기준으로 분류
CreateTOC "-", 1
'4. 각 시트 B1 셀에 '목차로 돌아가기' 링크 생성
CreateTOC "-", 1, True, B1
CreateTOC
'2. 시트를 오름차순으로 정렬한 뒤 목차 생성
CreateTOC SortOrder:=1
'3. 시트를 오름차순으로 정렬한 뒤, "-" 기호를 기준으로 분류
CreateTOC "-", 1
'4. 각 시트 B1 셀에 '목차로 돌아가기' 링크 생성
CreateTOC "-", 1, True, B1
아래 링크를 확인해주시겠어요?
추가기능 설치방법은 아래 링크를 확인해주시겠어요?
https://www.oppadu.com/엑셀-추가기능-설치방법/
감사합니다.
수정을 어떻게 해야 하는지요
명령문의 아래 부분을 찾아서
아래처럼 변경해보시겠어요?
제 답변이 도움이 되셨으면 좋겠습니다 ^^
좋은 의견 감사드립니다.
매일 좋은하루 보내세요
모바일에서 사용하시려면, '아이폰 또는 안드로이드'용 엑셀 APP 을 사용하셔야 합니다.
이후 셀을 클릭하시면 '링크이동' 이라는 버튼이 나오는데, 버튼을 클릭하면 해당 시트로 이동하게 됩니다 ^^
제 답변이 도움이 되셨길 바랍니다.
감사합니다.
클릭해두 아무것도 실행이 안되는데요
추가기능 오류 관련 설명은 아래 링크를 확인해보시겠어요?
https://www.oppadu.com/%ec%97%91%ec%85%80-%ec%b6%94%ea%b0%80%ea%b8%b0%eb%8a%a5-%ec%84%a4%ec%b9%98%eb%b0%a9%eb%b2%95/
새롭게 변경되는 시트를 자동으로 인식하려면 사용중인 통합문서에 매크로 이벤트를 따로 추가해주시면 가능합니다..ㅜ 다만 어느정도 매크로 기본 작성방법을 아셔야 해결하실 수 있습니다. 추가기능으로는 구현이 어려운 부분이라 직접 작성하셔야 해결하실 수 있을 듯 합니다.
이번에 새로 가입하고 목차 추가기능 잘 사용하고 있습니다
창진님께서 여쭤 본것과 같은 내용인데요
혹시 직접 작성하기 위해서 참고할만한 강좌가 있는지요?
아님 대략적으로 방향이라도 알려주시면 한번 해보려고 합니다
업무 사양서를 만들다 보니 위크시트가 계속 추가가 되는데 그때 마다 지금은 목차를 새로 만들고 기존 목차는 삭제하는 작업을 반복하는데 많이 번거롭네요 ^^
번거로우시겠지만 조언 부탁드립니다
감사합니다
영문 버전은 조만간 업데이트 해 드리겠습니다.
감사합니다.
목차 만들고 나서 다시 엑셀 켜면 삽입탭에 목차생성 단추가 없습니다.
목차생성 단추를 계속 표시하길 원하실 경우, 추가기능 형태로 등록하면 됩니다. :)
홈페이지에서 제공하는 목차생성 추가기능을 사용해보세요.
오늘 자주 쓰는 실무엑셀 구입하고 목록을 보니 목차생성 자동화는 없어보여요.
제가 현재 작성하고 있는 파일을 목차생성 자동화로 만들긴 햇어요.
근데 돌아가기 셀 A1셀을 수정하는 방법과 새로운 시트가 추가됏을시 목차에 반영되는 방법을 알고 싶습니다.
근데 VBA에는 초보입니다.
제가 작성한 엑셀 파일을 첨부하여 가르침 받고 싶은데요
VBA 기초/활용은 이전에 4회 완성으로 특강을 진행한적이 있습니다.
아래 링크를 한번 확인해보시겠어요?
https://www.oppadu.com/%ec%97%91%ec%85%80-live-101%ea%b0%95/
2-3시간씩 4회 학습하시면 실무에 필요한 대부분이 VBA 기능을 배울 수 있습니다.