반응형
실무 자동화 (13편): 1시간 노가다를 1초로 — "여러 파일 하나로 합치기" (통합 매크로)
안녕하세요, 업무 현장의 지루한 반복 작업을 코딩으로 박멸하여 여러분의 저녁을 되찾아드리는 '칵칵'입니다. ☕
월말이나 분기 말이 되면 각 부서나 거래처에서 보내온 수십 개의 엑셀 파일을 하나로 합치느라 고생하고 계신가요? 파일을 하나하나 열어서 복사(Ctrl+C), 내 파일에 붙여넣기(Ctrl+V), 그리고 파일을 닫는 이 과정을 50번, 100번 반복하다 보면 어느새 손목은 시큰거리고 퇴근 시간은 저 멀리 사라지기 마련입니다. 오늘은 특정 폴더 안에 있는 모든 엑셀 파일을 순식간에 읽어와 하나의 시트로 깔끔하게 통합하는 VBA 마법을 공유합니다.
🛠 다중 파일 통합 자동화 VBA 코드
Sub MergeAllWorkbooks()
Dim folderPath As String
Dim fileName As String
Dim targetWB As Workbook
Dim sourceWB As Workbook
Dim targetWS As Worksheet
Dim lastRow As Long
Dim nextRow As Long
' 1. 현재 파일을 통합할 대상으로 지정
Set targetWB = ThisWorkbook
Set targetWS = targetWB.ActiveSheet
' 2. 통합할 파일이 들어있는 폴더 선택 (팝업창)
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "통합할 엑셀 파일들이 들어있는 폴더를 선택하세요"
If .Show = -1 Then
folderPath = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With
' 3. 폴더 내 첫 번째 엑셀 파일 찾기
fileName = Dir(folderPath & "*.xls*")
Application.ScreenUpdating = False ' 화면 떨림 방지 및 속도 향상
Application.Calculation = xlCalculationManual ' 자동 계산 중지
' 4. 폴더 내 모든 파일을 순회하며 데이터 복사
Do While fileName <> ""
' 현재 실행 중인 파일(이 매크로가 담긴 파일)은 제외
If fileName <> targetWB.Name Then
Set sourceWB = Workbooks.Open(folderPath & fileName)
' 원본 파일 첫 번째 시트의 마지막 행 찾기
lastRow = sourceWB.Sheets(1).Cells(sourceWB.Sheets(1).Rows.Count, 1).End(xlUp).Row
' 데이터가 헤더(1행) 외에 존재하는 경우에만 복사
If lastRow >= 2 Then
' 대상 시트의 다음 데이터가 들어갈 행 번호 계산
nextRow = targetWS.Cells(targetWS.Rows.Count, 1).End(xlUp).Row + 1
' 원본의 2행부터 마지막 행까지 복사하여 대상 시트에 붙여넣기
sourceWB.Sheets(1).Rows("2:" & lastRow).Copy targetWS.Cells(nextRow, 1)
End If
' 원본 파일 저장하지 않고 닫기
sourceWB.Close SaveChanges:=False
End If
' 다음 파일 이름 가져오기
fileName = Dir()
Loop
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "모든 데이터 통합이 완료되었습니다! 수고하셨습니다."
End Sub
💡 코드 핵심 해설 (실무 포인트)
- Application.FileDialog(msoFileDialogFolderPicker): 코드 안에 폴더 경로를 고정하지 않고, 실행할 때마다 사용자가 폴더를 직접 선택할 수 있게 하여 유연성을 높였습니다.
- Dir 함수: 폴더 내의 파일 목록을 하나씩 훑어 내려가는 역할을 합니다. `*.xls*` 패턴을 통해 구버전(.xls)과 신버전(.xlsx, .xlsm) 파일을 모두 인식합니다.
- ScreenUpdating & Calculation: 대량의 파일을 열고 닫을 때 화면 갱신과 수식 재계산을 잠시 멈춤으로써 매크로 실행 속도를 10배 이상 끌어올립니다.
- Rows("2:" & lastRow): 각 파일의 제목 행(1행)을 제외하고 실제 데이터가 시작되는 2행부터 가져오도록 설계하여, 통합 문서에 제목이 반복되지 않게 합니다.
⚠️ 칵칵의 포인트 해설: 여기서 실수하면 큰일 납니다!
- 실수 1: 데이터 열 구조 불일치 - 합치려는 파일들의 열 순서(예: A열 날짜, B열 업체명 등)가 모두 같아야 합니다. 한 파일이라도 형식이 다르면 데이터가 뒤섞여 엉망이 됩니다.
- 실수 2: 숨겨진 행과 필터 - 원본 파일에 필터가 걸려 있거나 행이 숨겨져 있어도 VBA는 모든 데이터를 긁어옵니다. 필요하다면 복사 전 필터를 해제하는 코드를 추가해야 합니다.
- 실수 3: 파일 차단 해제 - 인터넷에서 다운로드한 파일들은 윈도우 보안 설정으로 인해 매크로가 파일을 열 때 경고창을 띄울 수 있습니다. 실행 전 폴더 내 파일들의 보안 차단을 해제하세요.
- 실수 4: 매크로 포함 통합 문서 저장 - 이 코드를 작성한 파일은 반드시 **.xlsm** 형식으로 저장해야 합니다. 일반 엑셀 파일(.xlsx)로 저장하면 공들여 짠 코드가 모두 증발합니다!
다음 엑셀 이야기 예고: 「엑셀 VBA (14편): 여러 장의 시트를 조건에 따라 자동으로 나누는 "시트 분할 매크로" 제작하기」
반응형
'코딩으로 시간 벌기 > 엑셀 VBA' 카테고리의 다른 글
| 실무 자동화 (12편): 클릭 한 번으로 "거래처별 대량 메일 자동 발송" (Outlook 연동) (0) | 2026.04.04 |
|---|---|
| 실무 자동화 (11편): 조건에 맞는 데이터만 "PDF로 자동 변환" 하여 저장하기 (0) | 2026.03.31 |
| 실무 자동화 (10편): 조건에 맞는 데이터만 골라 시트별로 자동 분리하기 (0) | 2026.03.26 |
| 실무 자동화 (9편): 1시간 노가다를 1초로 - 여러 파일 하나로 합치기 (0) | 2026.03.24 |
| 여덟 번째 이야기: 수천 줄 데이터에서 '원하는 것'만 쏙 뽑아내기 (0) | 2026.03.22 |
