폴더 안 30개 엑셀 파일 자동 통합 — VBA Dir + Workbooks.Open 풀 가이드

월말에 지점별 엑셀 30개를 하나로 붙이느라 Ctrl+C를 반복하다 손목이 아팠던 적, 있으시죠? 저는 C:\보고서\2026-03\ 같은 폴더를 Dir 루프 한 번으로 훑어 통합 시트에 쌓는 매크로를 김대리 팀 표준으로 박아 뒀어요. 열어서 복사하는 시간이 통째로 사라집니다.

핵심은 Dir(폴더 & "*.xlsx") — 다음 파일명을 문자열로 돌려줍니다. On Error로 파일 하나가 깨져도 나머지는 계속 돌게 하는 게 실무 필수예요.

이 글을 따라 하면 얻는 것
– Dir + Workbooks.Open 루프
– 헤더 중복·시트명 통일
– 통합 시트에 Append
– 파일별 오류 격리

1. 폴더 구조 가정

C:\보고서\지점\
  강남_3월.xlsx
  부산_3월.xlsx
  ...

각 파일 데이터 시트 A1:C — 지점 | 월 | 매출. 통합 문서 통합 시트에 아래로 쌓습니다.

2. 기본 통합 매크로

Sub 폴더엑셀통합()
    Dim 폴더 As String
    Dim 파일명 As String
    Dim wb As Workbook
    Dim ws원본 As Worksheet, ws통합 As Worksheet
    Dim 다음행 As Long

    폴더 = "C:\보고서\지점\"
    If Right(폴더, 1) <> "\" Then 폴더 = 폴더 & "\"

    Set ws통합 = ThisWorkbook.Worksheets("통합")
    다음행 = ws통합.Cells(ws통합.Rows.Count, 1).End(xlUp).Row + 1
    If 다음행 = 2 And ws통합.Range("A1").Value = "" Then 다음행 = 1

    Application.ScreenUpdating = False
    On Error GoTo 오류처리

    파일명 = Dir(폴더 & "*.xlsx")
    Do While 파일명 <> ""
        If 파일명 <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(폴더 & 파일명, ReadOnly:=True)
            Set ws원본 = wb.Worksheets("데이터")
            ws원본.UsedRange.Copy ws통합.Cells(다음행, 1)
            다음행 = ws통합.Cells(ws통합.Rows.Count, 1).End(xlUp).Row + 1
            wb.Close SaveChanges:=False
        End If
        파일명 = Dir()
    Loop

    Application.ScreenUpdating = True
    MsgBox "통합 완료: " & (다음행 - 1) & "행 근처"
    Exit Sub

오류처리:
    Application.ScreenUpdating = True
    MsgBox "오류: " & Err.Description & vbCrLf & "파일: " & 파일명
End Sub

Dir() 두 번째 호출부터 인자 없이 — 같은 폴더 다음 파일.

3. 헤더 한 번만

첫 파일만 머리글 복사, 이후는 2행부터:

Dim 첫파일 As Boolean
첫파일 = True
' ... Open 후 ...
If 첫파일 Then
    ws원본.UsedRange.Copy ws통합.Cells(다음행, 1)
    첫파일 = False
Else
    ws원본.Range("A2").CurrentRegion.Offset(1, 0).Copy ws통합.Cells(다음행, 1)
End If

4. xlsm·xls 포함

파일명 = Dir(폴더 & "*.xls*")

*.xls*는 xls·xlsx·xlsm 모두. 통합 문서 자신ThisWorkbook.Name 비교로 제외.

5. 성능·안정

이유
ScreenUpdating = False 깜빡임·속도
ReadOnly:=True 실수 저장 방지
DisplayAlerts = False 링크 업데이트 팝업
파일마다 On Error GoTo NextFile 한 파일 실패 격리
On Error GoTo NextFile
' ... open/copy ...
NextFile:
    Err.Clear
    On Error GoTo 0
    파일명 = Dir()

중복 제거는 통합 직후 Dictionary나 RemoveDuplicates로 이어지면 깔끔해요.

6. Power Query vs VBA

Power Query가 표준이면 PQ 우선. 폴더 경로가 매번 바뀌거나 동료 PC에서 버튼 한 번이 필요하면 VBA가 낫습니다.

7. FAQ

Q. 하위 폴더까지?
Dir(폴더 & "*", vbDirectory) 재귀 — 깊이 2단 이상이면 Python pandas도 검토.

Q. 열린 파일?
GetOpenFilename으로 선택 목록 받기.

Q. CSV?
Workbooks.OpenText 또는 PQ.

8. 연습

샘플 xlsx 3개 + 통합 시트 1) Dir 루프 2) 헤더 한 번 3) 오류 한 파일 스킵 4) 행 수 MsgBox.

다음: 거래처별 시트 분리 · PDF보내기.

참고: Dir 함수 · 배열 가이드.

실무 메모 1

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 2

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 3

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 4

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 5

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 6

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 7

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 8

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 9

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 10

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 11

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 12

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 13

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 14

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 15

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 16

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 17

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 18

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 19

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 20

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 21

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 22

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 23

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 24

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 25

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 26

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 27

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 28

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 29

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 30

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 31

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 32

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 33

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 34

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 35

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 36

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 37

Dir() 두 번째부터 인자 없이. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 38

ThisWorkbook.Name 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 39

ReadOnly:=True로 원본 보호. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

작성자 소개