엑셀 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 키를 누르면 언제든지 원하는 파일과 각 파일의 특정 시트를 선택하여 내용을 병합할 수 있습니다.

엑셀 파일 합치기 프로그램 완성
파일 합치기 프로그램 만들기가 완료되었습니다.
4.9 36 투표
게시글평점
66 댓글
Inline Feedbacks
모든 댓글 보기
66
0
여러분의 생각을 댓글로 남겨주세요.x