VBA
[Excel][VBA] Sub Procesure 작성 실전
어린왕자1234
2021. 11. 23. 15:48
[ PROJECT ] 통합문서에 있는 시트를 알파벳 순으로 정렬하기
▶ 프로젝트의 목적을 정하라!
▶ 요구사항 작성하라!
- 실행하기 쉽고
- 언제나 사용가능(PERSONAL.XLSB 모듈에 코드 저장 필요)
- 열려 있는 통합문서에서 제대로 동작해야 한다.
- 에러가 없어야 한다.
▶ 프로젝트와 관련해서 아는 내용 정리하라!
▶ 작업 계획을 세운다!
▶ 추가 필요 사항 점검하라!
▶ 매크로 기록기로 필요한 사항 알아내라!
-> 필요한 코드를 직접 실행창에서 테스트 해본다.
▶ 초기설정 : 개인용 매크로 통합문서 활성화 및 모듈 생성
▶ 코드 작성하기
1) 시트명 을 변수에 저장하는 프로시져 작성
Sub SortSheets() Dim SheetNames() As String Dim i As Long Dim SheetCount As Long SheetCount = ActiveWorkbook.Worksheets.Count ReDim SheetNames(1 To SheetCount) For i = 1 To SheetCount SheetNames(i) = ActiveWorkbook.Worksheets(i).Name Debug.Print SheetNames(i) Next End Sub |
2) 정렬 프로시저를 검색하여 작성한다. ( BubbleSort )
Sub BubbleSort(List() As String) ' Sorts the List array in ascending order Dim First As Long, Last As Long Dim i As Long, j As Long Dim Temp As String First = LBound(List) Last = UBound(List) For i = First To Last - 1 For j = i + 1 To Last If List(i) > List(j) Then Temp = List(j) List(j) = List(i) List(i) = Temp End If Next j Next i End Sub |
3) 배열순으로 시트를 오름 차순으로 정렬
For i = 1 To SheetCount ActiveWorkbook.Sheets(SheetNames(i)).Move before:=ActiveWorkbook.Sheets(i) Next i |
▶ 다른 환경에서 추가 테스트해본다!
▶ 추가로 확인된 문제 해결하기
다른 환경에서 추가 테스트한 문제점 | 추가로 확인된 문제 해결하기 |
- 정렬 중 화면이 업데이트 되면서 시간이 오래 걸림 | '프로시저 시작 부분에 Application.ScreenUpdating = False ' 프로시저 마지막 부분에 Application.ScreenUpdating = True |
- 대문자 시트명이 소문자 시트명 앞에 놓이는 문제 발생 |
'방법1 : 문자열 대문자화 If UCase(List(i)) > UCase(List(j)) Then ' 방법2 : 아래의 옵션을 모듈 상단에 추가( A를 a와 동일 시 ) Option Compare Text |
- 활성화된 통합문서 미존재시 에러 발생 |
'방법1 : 열려있는 통합문서 미존재시 프로시저 종료 If ActiveWorkbook Is Nothing Then Exit Sub '방법2 : 에러처리 On Error Resume Next SheetCount = ActiveWorkbook.Worksheets.Count If Err <> 0 Then Exit Sub |
- 통합문서가 보호상태이면 Move 메소드 적용 불가 |
사용자가 보호설정한 이유가 있으니 고객에게 보호상태임을 알려 보호설정해제후 다시 시도하도록 경보 창 표시 If ActiveWorkbook.ProtectStructure Then MsgBox ActiveWorkbook.Name & " is protected.", _ vbCritical, "Cannot Sort Sheets." Exit Sub End If ![]() |
- 정렬을 마친 후 마지말 셀이 활성화됨 |
Dim OldActiveSheet As Worksheet ' 프로시저 변수 선언문 다음에 Set OldActiveSheet = ActiveSheet ScreenUpdating문 앞에 OldActiveSheet.Activate |
- 매크로 중지(Ctrl + Break) 하면 에러 발생 |
'방법1 : 매크로 중지 비활성화 application.EnableCancelKey = xlDisabled ' Ctrl + Break 활성화 Application.EnableCancelKey = xlInterrupt '방법2 : 메시지창을 이용하여 Sort할지 여부 확인 If MsgBox("Sort the sheets in the active workbook?", _ vbQuestion + vbYesNo) <> vbYes Then Exit Sub |
- 매크로 실행전으로 되돌릴 수 없다. |
▶ 유틸리티로 활용하기 : 매크로 옵션에서 바로가기키를 만들어 사용
▶ 배포 : 모듈을 내보내기하여 배포 (확장자 bas파일)
▶ 모듈 가져와 재사용하기 : PERSONAL.XLSB 프로젝트에서 가져오기하여 사용한다.