Option Explicit

Sub ConsolidateEventParticipants()
    ' 변수 선언
    Dim fd As FileDialog
    Dim folderPath As String, parentPath As String
    Dim fileName As String
    Dim wbSource As Workbook, wbTarget As Workbook
    Dim wsStage As Worksheet, wsReport As Worksheet
    Dim nextRow As Long, lastRow As Long, i As Long
    Dim listA As String, listB As String, listC As String
    Dim logMsg As String
    
    On Error GoTo ErrorHandler
    
    ' [1] 폴더 선택 및 경로 설정
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    If fd.Show = -1 Then
        folderPath = fd.SelectedItems(1) & "\"
        ' 상위 폴더 경로 추출
        parentPath = Left(folderPath, InStrRev(Left(folderPath, Len(folderPath) - 1), "\"))
    Else
        MsgBox "폴더가 선택되지 않았습니다.", vbExclamation
        Exit Sub
    End If

    ' [2] 결과 저장용 새 워크북 생성 및 초기화
    Set wbTarget = Workbooks.Add
    Set wsStage = wbTarget.Sheets(1)
    wsStage.Name = "취합"
    
    ' 헤더 작성
    wsStage.Range("A1:G1").Value = Array("부서", "이름", "직급", "행사A", "행사B", "행사C", "비고")
    
    ' [3] 폴더 내 파일 순회 시작
    fileName = Dir(folderPath & "*.xls*")
    
    Do While fileName <> ""
        ' 자기 자신(결과 파일)이 열려있을 경우 제외
        If fileName <> wbTarget.Name Then
            Debug.Print "로그: 파일 처리 중 - " & fileName ' 실행 로그
            
            Set wbSource = Workbooks.Open(folderPath & fileName, ReadOnly:=True)
            ' 소스 파일의 첫 번째 시트 기준 (필요시 시트명 지정 가능)
            With wbSource.Sheets(1)
                lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row ' 이름 열 기준 마지막 행
                If lastRow >= 2 Then
                    nextRow = wsStage.Cells(wsStage.Rows.Count, "A").End(xlUp).Row + 1
                    ' 데이터 값만 복사 (2행부터 마지막행까지)
                    .Range("A2:G" & lastRow).Copy
                    wsStage.Range("A" & nextRow).PasteSpecial xlPasteValues
                End If
            End With
            
            wbSource.Close False
        End If
        fileName = Dir
    Loop

    ' [4] 참여자 명단 가공 (Transformation)
    Debug.Print "로그: 명단 가공 시작"
    Set wsReport = wbTarget.Worksheets.Add(After:=wsStage)
    wsReport.Name = "참여자리스트"
    
    lastRow = wsStage.Cells(wsStage.Rows.Count, "B").End(xlUp).Row
    
    For i = 2 To lastRow
        ' 이름(부서) 형식 생성
        Dim personInfo As String
        personInfo = wsStage.Cells(i, 2).Value & "(" & wsStage.Cells(i, 1).Value & ")"
        
        ' 행사 A (D열) 체크 확인
        If Len(wsStage.Cells(i, 4).Value) > 0 Then
            listA = listA & IIf(listA = "", "", ", ") & personInfo
        End If
        ' 행사 B (E열) 체크 확인
        If Len(wsStage.Cells(i, 5).Value) > 0 Then
            listB = listB & IIf(listB = "", "", ", ") & personInfo
        End If
        ' 행사 C (F열) 체크 확인
        If Len(wsStage.Cells(i, 6).Value) > 0 Then
            listC = listC & IIf(listC = "", "", ", ") & personInfo
        End If
    Next i

    ' [5] 리포트 양식 작성
    With wsReport
        .Range("A1").Value = "행사A"
        .Range("A2").Value = listA
        
        .Range("A4").Value = "행사B"
        .Range("A5").Value = listB
        
        .Range("A7").Value = "행사C"
        .Range("A8").Value = listC
        
        .Columns("A").ColumnWidth = 100 ' 가독성을 위해 열 너비 조정
        .Rows.AutoFit
    End With

    ' [6] 파일 저장 및 마무리
    Application.DisplayAlerts = False
    wbTarget.SaveAs parentPath & "행사 참여자 리스트 정리.xlsx"
    Application.DisplayAlerts = True
    
    MsgBox "취합이 완료되었습니다!" & vbCrLf & "경로: " & parentPath, vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "오류 발생!" & vbCrLf & "단계: " & fileName & vbCrLf & "내용: " & Err.Description, vbCritical
    If Not wbSource Is Nothing Then wbSource.Close False
End Sub