티스토리 뷰

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 프로젝트에서  가져오기하여 사용한다.

SortSheets.bas
0.00MB