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