[VBA] 엑셀 파일 합치기 예시 코드

여러 엑셀 파일에 있는 시트를 모아서 처리하고 싶은 경우가 있습니다. 이때 사용할 수 있는 VBA 매크로 코드예요.

각 파일의 시트가 복사되어, 현재 열려 있는 엑셀 파일에 추가할 수 있어요. 코드는 다음과 같습니다.

엑셀 파일 합치기 예시 코드

Sub MergeExcelFiles()
    Dim fnameList, fnameCurFile As Variant
    Dim countFiles, countSheets As Integer
    Dim wksCurSheet As Worksheet
    Dim wbkCurBook, wbkSrcBook As Workbook

    ' 여러 엑셀 파일 선택
    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="합칠 엑셀 파일을 선택하세요", MultiSelect:=True)

    ' 파일이 선택되었는지 확인
    If (vbBoolean <> VarType(fnameList)) Then

        ' 선택된 파일이 있으면 처리 시작
        If (UBound(fnameList) > 0) Then
            countFiles = 0
            countSheets = 0

            ' 화면 업데이트 및 계산 중지
            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual

            ' 현재 작업 중인 엑셀 파일 저장
            Set wbkCurBook = ActiveWorkbook

            ' 선택된 각 파일을 열고 시트 복사
            For Each fnameCurFile In fnameList
                countFiles = countFiles + 1

                ' 현재 파일 열기
                Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)

                ' 각 파일의 모든 시트를 복사
                For Each wksCurSheet In wbkSrcBook.Sheets
                    countSheets = countSheets + 1
                    wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
                Next

                ' 복사가 끝난 파일 닫기 (변경 사항 저장하지 않음)
                wbkSrcBook.Close SaveChanges:=False
            Next

            ' 화면 업데이트 및 계산 재개
            Application.ScreenUpdating = True
            Application.Calculation = xlCalculationAutomatic

            ' 결과 알림 메시지
            MsgBox "총 " & countFiles & "개의 파일을 처리했습니다." & vbCrLf & "총 " & countSheets & "개의 시트를 병합했습니다.", Title:="엑셀 파일 병합 완료"

        End If
    Else
        ' 파일이 선택되지 않았을 때 알림
        MsgBox "선택된 파일이 없습니다.", Title:="엑셀 파일 병합"
    End If
End Sub

프로그램의 흐름

  1. 파일 선택
    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)
    
    프로그램이 시작되면 먼저 사용자가 합치고 싶은 엑셀 파일을 선택하도록 팝업 창이 열립니다. GetOpenFilename 함수는 파일 선택 창을 띄우고, 선택한 파일들의 경로를 fnameList 변수에 저장합니다. 여러 파일을 선택할 수 있도록 MultiSelect:=True 옵션이 사용되었습니다.
  2. 선택한 파일이 있는지 확인
    If (vbBoolean <> VarType(fnameList)) Then
    
    사용자가 파일을 선택했는지 확인하는 부분입니다. 파일을 선택하지 않으면 아래 단계는 실행되지 않고, 경고 메시지가 표시됩니다.
  3. 엑셀 화면 업데이트 중지
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    여러 파일과 시트를 처리할 때 화면 업데이트와 자동 계산을 중지시켜 속도를 높입니다. 이 부분이 없으면 프로그램 실행 중 화면이 깜빡이거나 느려질 수 있습니다.
  4. 현재 열려 있는 엑셀 파일을 기준으로 작업
    Set wbkCurBook = ActiveWorkbook
    
    현재 사용 중인 엑셀 파일을 wbkCurBook 변수에 저장합니다. 이 파일에 다른 파일의 시트를 복사해 넣을 것입니다.
  5. 파일 열기와 시트 복사
    For Each fnameCurFile In fnameList
    
    사용자가 선택한 파일들(fnameList)을 하나씩 열어서 처리합니다.
    Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)
    
    각 파일을 열고, wbkSrcBook 변수에 저장합니다. 이제 이 파일에 있는 시트들을 복사할 차례입니다.
    For Each wksCurSheet In wbkSrcBook.Sheets
    
    열려 있는 파일의 모든 시트를 순회하면서 하나씩 현재 파일로 복사합니다.
    wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
    
    시트를 복사할 때, 현재 파일의 마지막 시트 뒤에 붙여넣습니다. 이 과정을 모든 파일과 시트에 대해 반복합니다.
  6. 복사 완료 후 파일 닫기
    wbkSrcBook.Close SaveChanges:=False
    
    시트를 복사한 후, 원래 파일은 저장하지 않고 닫습니다. SaveChanges:=False는 파일을 수정하지 않았음을 의미합니다.
  7. 완료 후 화면 업데이트 재개
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    모든 작업이 끝나면 다시 화면 업데이트와 계산을 자동으로 돌려놓습니다. 이는 사용자에게 작업이 완료되었음을 시각적으로 확인할 수 있도록 해줍니다.
  8. 결과 알림
    MsgBox "Processed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
    
    마지막으로, 몇 개의 파일과 시트가 합쳐졌는지 메시지 박스를 통해 알려줍니다. countFilescountSheets 변수는 각각 처리된 파일 수와 시트 수를 세는 데 사용됩니다.
이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗