' ===================================================================
'  [2일차 정답본 매크로]
'
'  설계 원칙 2가지 (실측으로 확인된 문제를 피하기 위함):
'   1) MsgBox 를 쓰지 않는다.
'      모달 대화상자는 실행을 멈춰 세운다. 결과(새 시트)가 눈에 보이므로
'      별도 알림이 없어도 수강생은 성공 여부를 바로 안다.
'   2) 여러 번 실행해도 안전해야 한다.
'      수강생은 매크로를 두 번, 세 번 돌린다. 기존 시트를 먼저 지우지 않으면
'      '이미 있는 시트 이름' 오류로 강의가 멈춘다.
' ===================================================================

Sub 부서별_시트분리_및_서식적용()
    ' 원본 시트를 부서별로 분리하고 서식을 일괄 적용한다.
    ' 부서명 앞뒤 공백은 Trim으로 흡수한다 ('총무과 ' → '총무과')
    Dim ws As Worksheet, dst As Worksheet
    Dim lastRow As Long, i As Long, k As Long
    Dim dept As String
    Dim seen As Object
    Set seen = CreateObject("Scripting.Dictionary")

    Set ws = ThisWorkbook.Worksheets("원본")

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ' [재실행 안전장치] 원본 외의 기존 부서 시트를 먼저 정리한다.
    ' 반드시 뒤에서 앞으로(Step -1) 지운다. For Each로 순회하며 지우면
    ' 컬렉션이 줄어들면서 열거자가 항목을 건너뛸 수 있다.
    For k = ThisWorkbook.Worksheets.Count To 1 Step -1
        If ThisWorkbook.Worksheets(k).Name <> "원본" Then
            ThisWorkbook.Worksheets(k).Delete
        End If
    Next k

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        dept = Trim(ws.Cells(i, 1).Value)
        If dept <> "" Then
            If Not seen.Exists(dept) Then
                Set dst = ThisWorkbook.Worksheets.Add( _
                    After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
                dst.Name = dept
                ' 행 전체가 아니라 A~E 범위만 복사한다 (불필요한 서식 전파 방지)
                ws.Range("A1:E1").Copy dst.Range("A1")
                dst.Rows(1).Font.Bold = True
                dst.Rows(1).Interior.Color = RGB(220, 230, 245)
                seen.Add dept, 2
            Else
                Set dst = ThisWorkbook.Worksheets(dept)
            End If
            ws.Range(ws.Cells(i, 1), ws.Cells(i, 5)).Copy dst.Cells(seen(dept), 1)
            seen(dept) = seen(dept) + 1
        End If
    Next i

    For Each dst In ThisWorkbook.Worksheets
        dst.Columns("A:E").AutoFit
        dst.Columns("E").NumberFormat = "#,##0"
    Next dst

    ws.Activate
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub


Sub 중복행_제거()
    ' [2일차 14:00 데이터 정리 모듈]
    ' 부서·성명·구분·집행일·금액이 모두 같은 행을 중복으로 보고 제거한다.
    ' 주의: 제거 전에 합계가 얼마였는지 먼저 확인하게 한다.
    '       중복 때문에 부풀려진 금액이 줄어드는 것을 눈으로 보는 것이 학습 포인트다.
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("원본")
    Application.DisplayAlerts = False
    ws.Range("A1").CurrentRegion.RemoveDuplicates _
        Columns:=Array(1, 2, 3, 4, 5), Header:=xlYes
    Application.DisplayAlerts = True
End Sub
