오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴

엑셀 VBA 파일 합치기 모듈 :: 엑셀 파일병합 프로그램

엑셀 파일 합치기를 위한 VBA 마스터 코드의 동작원리와 파일병합 툴 제작을 위한 실전 응용법을 단계별로 알아봅니다.

# VBA

작성자 :
오빠두엑셀
최종 수정일 : 2023. 02. 02. 00:58
URL 복사
메모 남기기 : (66)

엑셀 VBA 파일 합치기 프로그램 만들기 :: 오빠두 퀵 VBA 4강

엑셀 파일 합치기 프로그램 목차 바로가기
영상강의


예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.

  • [엑셀VBA] 엑셀 파일합치기 모듈 (파일병합 프로그램)
    완성파일

엑셀 파일 합치기 프로그램 유저폼 추가하기

사용자가 원하는 파일을 쉽게 선택할 수 있도록 사용자 정의 유저폼을 추가합니다. 예제파일을 다운받은 뒤 개발도구 - Visual Basic 버튼을 클릭하거나, 단축키 ALT + F11을 눌러 매크로편집기를 실행합니다. 만약 개발도구 탭이 안 보일경우, 아래 개발도구 활성화 관련 링크를 참고하세요.

매크로 편집창이 실행되면, 상단의 [삽입] – [사용자 정의 폼]을 클릭하여 아래와 같이 사용자정의폼을 생성합니다.

속성창이 안 보일 경우, 키보드 F4키를 누르거나 또는 상단의 [보기] – [속성 창]을 선택합니다. 도구상자가 안 보일 경우, 상단의 [보기] – [도구상자]를 선택하면 도구상자 창이 나타납니다.

엑셀 파일 합치기 사용자 정의폼 만들기
사용자에게 파일 합치기를 안내할 사용자정의폼을 생성합니다.

엑셀 파일 선택창 모듈 추가하기 (Multiple_FileDialog)

매크로 편집창에서 [삽입] – [모듈]을 클릭하여 새로운 모듈을 생성합니다.

모듈의 이름은 "sub_FileSelection"으로 변경합니다.

엑셀 VBA 모듈 이름 변경
새로운 모듈을 삽입한 뒤, 모듈의 이름을 변경합니다.

모듈이 추가 되었으면, 퀵 VBA 1강에서 다루었던 파일선택창 마스터코드를 복사하여 모듈 안에 붙여넣기합니다. 파일선택창 마스터코드에 대한 자세한 설명은 아래 퀵 VBA 1강 관련 링크를 참고하세요.

Public Function Multiple_FileDialog(Optional Title As String = "파일을 선택하세요", Optional FilterName As String = "엑셀파일", _
Optional FilterExt As String = "*.xls; *.xlsx; *.xlsm", Optional InitialFolder As String = "", _
Optional InitialView As MsoFileDialogView = msoFileDialogViewList, Optional MultiSelection As Boolean = True) As String
 
Dim FDG As FileDialog
Dim Selected As Integer: Dim i As Integer
Dim ReturnStr As String
 
Set FDG = Application.FileDialog(msoFileDialogFilePicker)
 
With FDG
.Title = Title
.Filters.Add FilterName, FilterExt
.InitialView = InitialView
.InitialFileName = InitialFolder
.AllowMultiSelect = MultiSelection
Selected = .Show
 
If Selected = -1 Then
For i = 1 To FDG.SelectedItems.Count - 1
ReturnStr = ReturnStr & FDG.SelectedItems(i) & ", "
Next i
ReturnStr = ReturnStr & FDG.SelectedItems(.SelectedItems.Count)
 
Multiple_FileDialog = ReturnStr
ElseIf Selected = 0 Then
MsgBox "선택된 파일이 없으므로 프로그램을 종료합니다."
End
End If
 
End With
 
End Function

'병합할 파일 선택' 버튼 명령문 추가하기

유저폼에서 [ 병합 할 파일 선택 ] 버튼을 더블클릭합니다. 버튼을 더블클릭하면 btnSelect_Click 명령문이 추가됩니다.

아래 명령문을 복사한 뒤, btnSelect_Click 명령문 위에 덮어쓰기 합니다.

Private Sub btnSelect_Click()
 
Dim strFilePath As String
Dim varFilePaths As Variant: Dim varFilePath As Variant
 
' 파일 선택 창 명령문에서 선택된 파일경로를 strFilePath로 받아옵니다.
strFilePath = Multiple_FileDialog
 
varFilePaths = Split(strFilePath, ", ")
 
Me.lstWB.Clear
' 각 파일 경로를 리스트상자에 추가합니다.
For Each varFilePath In varFilePaths
    Me.lstWB.AddItem varFilePath
Next
 
End Sub

엑셀 파일 합치기 본 명령문 작성하기

유저폼에서 [ 선택 된 파일 병합 ] 버튼을 더블클릭합니다. 더블클릭하면 btnMerge_Click 명령문이 추가됩니다.

명령문 안에 아래 전체명령문을 복사하여 덮어쓰기하거나 단계별로 코드를 작성합니다.

1. 변수 설정하기

명령문에 사용 될 변수를 설정합니다. 이전 강의에서 다룬 시트합치기 명령문에서 사용했던 것과 동일한 방식으로 변수를 설정합니다.

엑셀 매크로 변수 설정 방법에 대한 자세한 설명은 아래 관련 VBA 기초강의에서 관련 포스트를 참고하세요.

Dim WB as Workbook 	' : 병합할 엑셀파일입니다.
Dim WS as Worksheet 	' : 병합할 엑셀파일에 작성된 각각의 워크 시트입니다.
Dim toWS as Worksheet 	' : 각 WS의 내용을 취합할 활성화된 워크 시트입니다.
Dim rng as Range 		' : 각 WS에서 취합될 범위입니다.
Dim i as Long 		' : 리스트상자에 선택된 엑셀파일들의 순번입니다.
Dim j as Long 		' : 복사한 rng를 toWS에 붙여넣기 할 행 번호입니다.
Dim endCol as Long 	' : rng의 넓이를 계산하기 위한 마지막 열번호입니다.
Dim endRow as Long 	' : rng의 넓이를 계산하기 위한 마지막 행번호입니다.
Dim strWS as String 	' : 이전 시트합치기 명령문에서만 사용된 변수이므로 지워도 무방합니다.
2. 오류 방지용 명령문 추가하기

만약 유저폼 리스트상자에 선택 된 파일이 없을 경우, 파일 합치기 명령문이 참조할 대상이 없으므로 해당 명령문은 오류를 반환하게 됩니다.

따라서 리스트상자의 선택된 값이 없을 경우, "파일을 선택하세요" 라는 안내 메시지를 띄운 뒤 명령문을 종료합니다.

'// 오류방지
If Me.lstWB.ListCount = 0 Then
    MsgBox "병합할 파일을 선택하세요."
    Exit Sub
End If
3. 리스트상자에 선택된 엑셀파일을 하나씩 실행/종료하기

리스트상자에 입력된 각각의 엑셀 파일을 실행하고 종료하는 명령문을 추가합니다.

For i = 0 To Me.lstWB.ListCount - 1
    Set WB = Application.Workbooks.Open(Me.lstWB.List(i))
 
	‘// 각 엑셀파일에서 실행될 명령문 작성 
 
WB.Close
Next
4. 실행된 엑셀파일을 돌아가며 워크시트의 이름 하나씩 비교하기

실행된 엑셀파일의 모든 워크시트를 하나씩 돌아가며 시트의 이름을 비교합니다. IF함수와 LIKE 연산자를 이용하여 각 시트이름을 비교한 뒤, 만약 해당 워크시트의 이름이 사용자가 원하는 조건을 만족할 경우 명령문을 실행하도록 코드를 작성합니다.

For Each WS In WB.Worksheets
        If WS.Name Like Me.txtFilter.Value & "*" Then
 
		‘// 해당 워크시트에서 실행될 명령문 작성
 
	  End If
Next
5. 선택된 시트의 내용 합치기

이전 시트합치기 강의에서 사용했던 명령문을 그대로 사용하여 선택된 시트의 내용을 병합합니다.

With WS
    endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    endRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    Set rng = .Range(.Cells(2, 1), .Cells(endRow, endCol))
    rng.Copy toWS.Cells(j, 1)
    j = j + rng.Rows.Count
End With
6. 안내메세지 출력

파일 병합이 완료되었다는 안내메세지를 띄운 후, 유저폼을 종료합니다.

'// 안내메세지
MsgBox "파일 병합이 완료 되었습니다."
Unload Me
7. 스크린 업데이트 중단/활성화 (매크로 동작속도 개선)

더욱 빠른 매크로 동작을 원할경우, Application.ScreenUpdating 속성을 활성/비활성화 하여 매크로 동작속도를 개선할 수 있습니다.

'// 스크린업데이트 및 파일 저장 알림 중단
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 
'// ..................
'// 실행할 명령문 작성
'// ..................
 
'//스크린 업데이트 파일 저장 알림 활성화
Application.ScreenUpdating = True
Application.DisplayAlerts = True
8. 파일 병합하기 버튼에 사용된 전체 명령문
Private Sub btnMerge_Click()
 
Dim WB As Workbook
Dim WS As Worksheet: Dim toWS As Worksheet
Dim rng As Range
Dim i As Long: i = 0: Dim j As Long
Dim endCol As Long: Dim endRow As Long
Dim strWS As String
 
'// 스크린업데이트 및 파일 저장 알림 중단
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 
'// 오류방지
If Me.lstWB.ListCount = 0 Then
    MsgBox "병합할 파일을 선택하세요."
    Exit Sub
End If
 
'// 파일병합
Set toWS = ActiveSheet
j = toWS.Cells(toWS.Rows.Count, 1).End(xlUp).Row
 
For i = 0 To Me.lstWB.ListCount - 1
    Set WB = Application.Workbooks.Open(Me.lstWB.List(i))
    For Each WS In WB.Worksheets
        If WS.Name Like Me.txtFilter.Value & "*" Then
                With WS
                    endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
                    endRow = .Cells(.Rows.Count, 1).End(xlUp).Row
                    Set rng = .Range(.Cells(2, 1), .Cells(endRow, endCol))
                    rng.Copy toWS.Cells(j, 1)
                    j = j + rng.Rows.Count
                End With
        End If
    Next
    WB.Close
Next
 
'// 안내메세지
MsgBox "파일 병합이 완료 되었습니다."
Unload Me
 
'// 스크린업데이트 및 파일 저장 알림 활성화
Application.ScreenUpdating = True
Application.DisplayAlerts = True
 
End Sub

파일 합치기 유저폼 실행을 위한 단축키 만들기

유저폼을 실행하기 위한 위한 명령문을 추가합니다.

아래 명령문을 복사한 뒤, 기존에 생성하였던 Module1 붙여넣기합니다.

Sub Merge_Workbook()
 
frmWBSelect.Show
 
End Sub

다시 엑셀 시트로 돌아온 뒤, 화면 상단의 [개발도구] – [매크로] 를 클릭하면 '매크로' 창이 출력됩니다. 매크로 창의 목록에서 방금 전에 추가한 Merge_Workbook을 선택한 뒤, [옵션] 버튼을 클릭합니다.

엑셀 개발도구 매크로 옵션 변경
[개발도구] – [매크로] 를 클릭하여 방금 추가한 ‘Merge_Workbook’의 옵션을 선택합니다.
매크로 옵션창이 출력되면, 해당 매크로를 실행하기 위한 단축키로 Ctrl + Shift + B 를 지정한 뒤 [확인] 버튼을 눌러 마무리합니다.

엑셀 매크로 단축키 설정
Merge_Workbook의 단축키를 Ctrl + Shift + B로 지정합니다.

엑셀 파일 합치기 매크로 완성 및 테스트

파일 합치기 매크로 작성이 완료되었습니다. 이제 단축키 Ctrl + Shift + B 키를 누르면 언제든지 원하는 파일과 각 파일의 특정 시트를 선택하여 내용을 병합할 수 있습니다.

엑셀 파일 합치기 프로그램 완성
파일 합치기 프로그램 만들기가 완료되었습니다.
댓글 66
4.9 (37개 평가)
TaylorJ
TaylorJ 2020.03.25 00:04
열심히 따라하고있습니다.
정말 좋은 강의 무료로 나누어주셔서 정말 감사합니다!
chicchick
chicchick 2020.05.17 19:47
안녕하세요! 유투브에서부터 잘 보고 사이트까지 들어와서 많이 배우고 있습니다.
그런데 문의드리고 싶은 내용이 있는데, 파일합치기 이후에 각 데이터의 가장 오른쪽에 새로운 컬럼을 만들어서 각 데이터의 출처 파일명도 같이 입력하게 할 수 있을까요? 예시파일로 보면, F열에 '파일명' 컬럼이 생기는 결과로 만들려고 합니다. Thisworkbookname으로 해보려고 했는데 매크로를 실행하는 엑셀의 파일명만 입력이 되네요.
오빠두엑셀
오빠두엑셀 작성자 2020.05.18 14:32
안녕하세요?
아래 명령문을,
With WS
endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
endRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng = .Range(.Cells(2, 1), .Cells(endRow, endCol))
rng.Copy toWS.Cells(j, 1)
j = j + rng.Rows.Count
End With

아래와 같이 수정해보시겠어요?
적절히 수정하여 사용하시면 될 듯 합니다.^^
With WS
endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
endRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng = .Range(.Cells(2, 1), .Cells(endRow, endCol))
rng.Copy toWS.Cells(j, 1)
Dim y as long
For y = j to j+endRow-1
toWs.Cells(y,endCol+1).Value = toWs.Name
Next
j = j + rng.Rows.Count
End With

답변이 도움이 되셨길 바랍니다.
chicchick
chicchick 2020.05.18 15:04
빠른 답변 감사합니다! 바로 적용해보았는데.. 아쉽게도 제가 생각하는대로는 되지 않는군요.
1. Data의 출처가 아닌, Data를 취합하는 Sheet의 이름이 입력됩니다.
2. Sheet명이 아닌 파일명 입력을 하려고 합니다.

2번은 작은 문제이겠지만 1번이 난감하네요. 바쁘시겠지만 도움주실 수 있으시면 댓글 부탁드려요!
오빠두엑셀
오빠두엑셀 작성자 2020.05.18 16:16
앗 제가 잘못 안내해드렸네요 ^^;
toWs.Cells(y,endCol+1).Value = toWs.Name

위에 명령문을
toWs.Cells(y,endCol+1).Value = Ws.Name

으로 변경해보세요.
chicchick
chicchick 2020.05.18 17:13
오오! 해결되었네요 ㅎㅎㅎ! 정말 감사합니다 ㅎㅎ 큰 도움이 되었어요.
김정민
김정민 2020.05.19 13:12
안녕하세요, 강의 영상 및 자료 매우 유용하게 사용하고 있습니다. 감사합니다.
한가지 여쭤보고 싶은게, 불러온 파일들의 내용을 같은열에 쌓지 않고, 다른열에 순서대로 불러올수 있을까요?
예를들어 각 파일의 H열을 병합하는 파일 A열부터 차례로 쌓고 싶은데.. 알려주시면 감사하겠습니다.
오빠두엑셀
오빠두엑셀 작성자 2020.05.19 15:32
안녕하세요?
코드를 수정하려면 어느정도 매크로에 대한 공부를 하셔야 하는데요.
아래 부분을

rng.Copy toWS.Cells(j, 1)
j = j + rng.Rows.Count

아래와 같이 상황에 맞춰 적절히 수정하시면 됩니다.^^
                    rng.Copy toWS.Cells(1, j)
j = j + rng.Columns.Count

답변이 도움이 되셨길 바랍니다.
감사합니다.
Teddy
Teddy 2020.05.26 11:14
안녕하세요? 좋은 강의 정말 감사드립니다. 혹시 파일이 합쳐질 때 파일 별 내용이 다른 음영으로 칠해지게 할 수는 없을까요? 알려주신 부분은 이해가 잘 되는데, 응용이 힘든 것 같습니다. ㅜㅜ
오빠두엑셀
오빠두엑셀 작성자 2020.05.26 15:47
셀의 음영 색상을 변경하시려면, .Interior.Color 속성을 변경하시면 됩니다.
상황에 맞게 코드를 응용하시려면 약간의 코딩 지식이 필요합니다 ^^;
엑엑셀셀
엑엑셀셀 2020.07.02 11:07
안녕하세요. 올려주신 강의파일 너무도 잘 사용하고 있습니다.

그런데 파일병합시 다시 한번 파일병합을 하면 이전에 병합했던 맨 마지막 데이터에 새로운 병합파일이 덮어져서, 맨 마지막 데이터가 사라지는 현상이 있습니다. 이건 어떻게 해결할수 있을까요?
유용한 강의 올려 주셔서 너무 감사합니다.
류효정
류효정 2020.07.09 17:34
안녕하세요. 알려주신 방법을 이용하는데, 셀의 범위를 바꾸고 싶은데 뭘 바꾸면 될까요.... 셀의 열을 더 선택해서 가져오고 싶어요.
오빠두엑셀
오빠두엑셀 작성자 2020.07.10 11:24
endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
부분을
endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1,2,3..
으로 뒤에 숫자를 더해보시길 바랍니다.^^
CPark
CPark 2020.07.29 17:37
안녕하세요 ~ 도움 잘 받고 있습니다 ^^
모든 파일의 첫번째 시트만 가져오려고 하면 어떻게 수정해야할까요?
답변 부탁드립니다 ~
오빠두엑셀
오빠두엑셀 작성자 2020.07.30 15:56
안녕하세요?^^
전체 명령문에서 사용된 아래 코드를
  For Each WS In WB.Worksheets
    If WS.Name Like Me.txtFilter.Value & "*" Then
아래와 같이 바꿔보세요.
  For Each WS In WB.Worksheets
    If WS.Index = 1 Then
dladnwns
dladnwns 2020.08.01 22:28
좋은 강의 감사드립니다~~
삽자루부대
삽자루부대 2020.08.20 18:05
예제파일이 쉬트합치기 입니다. 확인부탁드려요.
오빠두엑셀
오빠두엑셀 작성자 2020.08.21 10:13
첨부파일 확인해보니 파일합치기가 맞습니다.
다시 확인해보시길 바랍니다. :)
Hegon
Hegon 2020.09.23 09:38
좋은강의 감사합니다.

With WS 루프에서 복사한 내용을 기존에 존재하는 worksheet("WMS")에 붙여넣고 싶을어서

rng.Copy toWS부분을

rng.Copy Destination:=Worksheets("WMS").Cells(j, 39)로
고쳐봤는데 에러만 표시되네요.. 바쁜와중 대단히 죄송하지만, 좋은방법 있으면 알려주실 수 있으신지요..