사용자가 원하는 파일을 쉽게 선택할 수 있도록 사용자 정의 유저폼을 추가합니다. 예제파일을 다운받은 뒤 개발도구 - Visual Basic 버튼을 클릭하거나, 단축키 ALT + F11을 눌러 매크로편집기를 실행합니다. 만약 개발도구 탭이 안 보일경우, 아래 개발도구 활성화 관련 링크를 참고하세요.
PublicFunction Multiple_FileDialog(Optional Title AsString="파일을 선택하세요", Optional FilterName AsString="엑셀파일", _
Optional FilterExt AsString="*.xls; *.xlsx; *.xlsm", Optional InitialFolder AsString="", _
Optional InitialView As MsoFileDialogView = msoFileDialogViewList, Optional MultiSelection AsBoolean=True)AsStringDim FDG As FileDialog
Dim Selected AsInteger: Dim i AsIntegerDim ReturnStr AsStringSet FDG = Application.FileDialog(msoFileDialogFilePicker)With FDG
.Title= Title
.Filters.Add FilterName, FilterExt
.InitialView= InitialView
.InitialFileName= InitialFolder
.AllowMultiSelect= MultiSelection
Selected =.ShowIf Selected =-1ThenFor i =1To FDG.SelectedItems.Count-1
ReturnStr = ReturnStr & FDG.SelectedItems(i)&", "Next i
ReturnStr = ReturnStr & FDG.SelectedItems(.SelectedItems.Count)
Multiple_FileDialog = ReturnStr
ElseIf Selected =0Then
MsgBox "선택된 파일이 없으므로 프로그램을 종료합니다."EndEndIfEndWithEndFunction
'병합할 파일 선택' 버튼 명령문 추가하기
유저폼에서 [ 병합 할 파일 선택 ] 버튼을 더블클릭합니다. 버튼을 더블클릭하면 btnSelect_Click 명령문이 추가됩니다.
아래 명령문을 복사한 뒤, btnSelect_Click 명령문 위에 덮어쓰기 합니다.
PrivateSub btnSelect_Click()Dim strFilePath AsStringDim varFilePaths As Variant: Dim varFilePath As Variant
' 파일 선택 창 명령문에서 선택된 파일경로를 strFilePath로 받아옵니다.
strFilePath = Multiple_FileDialog
varFilePaths =Split(strFilePath, ", ")Me.lstWB.Clear' 각 파일 경로를 리스트상자에 추가합니다.ForEach varFilePath In varFilePaths
Me.lstWB.AddItem varFilePath
NextEndSub
엑셀 파일 합치기 본 명령문 작성하기
유저폼에서 [ 선택 된 파일 병합 ] 버튼을 더블클릭합니다. 더블클릭하면 btnMerge_Click 명령문이 추가됩니다.
Dim WB as Workbook ' : 병합할 엑셀파일입니다.Dim WS as Worksheet ' : 병합할 엑셀파일에 작성된 각각의 워크 시트입니다.Dim toWS as Worksheet ' : 각 WS의 내용을 취합할 활성화된 워크 시트입니다.Dim rng as Range ' : 각 WS에서 취합될 범위입니다.Dim i asLong' : 리스트상자에 선택된 엑셀파일들의 순번입니다.Dim j asLong' : 복사한 rng를 toWS에 붙여넣기 할 행 번호입니다.Dim endCol asLong' : rng의 넓이를 계산하기 위한 마지막 열번호입니다.Dim endRow asLong' : rng의 넓이를 계산하기 위한 마지막 행번호입니다.Dim strWS asString' : 이전 시트합치기 명령문에서만 사용된 변수이므로 지워도 무방합니다.
2. 오류 방지용 명령문 추가하기
만약 유저폼 리스트상자에 선택 된 파일이 없을 경우, 파일 합치기 명령문이 참조할 대상이 없으므로 해당 명령문은 오류를 반환하게 됩니다.
따라서 리스트상자의 선택된 값이 없을 경우, "파일을 선택하세요" 라는 안내 메시지를 띄운 뒤 명령문을 종료합니다.
'// 오류방지IfMe.lstWB.ListCount=0Then
MsgBox "병합할 파일을 선택하세요."ExitSubEndIf
3. 리스트상자에 선택된 엑셀파일을 하나씩 실행/종료하기
리스트상자에 입력된 각각의 엑셀 파일을 실행하고 종료하는 명령문을 추가합니다.
For i =0ToMe.lstWB.ListCount-1Set WB = Application.Workbooks.Open(Me.lstWB.List(i))
‘// 각 엑셀파일에서 실행될 명령문 작성
WB.CloseNext
4. 실행된 엑셀파일을 돌아가며 워크시트의 이름 하나씩 비교하기
실행된 엑셀파일의 모든 워크시트를 하나씩 돌아가며 시트의 이름을 비교합니다. IF함수와 LIKE 연산자를 이용하여 각 시트이름을 비교한 뒤, 만약 해당 워크시트의 이름이 사용자가 원하는 조건을 만족할 경우 명령문을 실행하도록 코드를 작성합니다.
ForEach WS In WB.WorksheetsIf WS.NameLikeMe.txtFilter.Value&"*"Then
‘// 해당 워크시트에서 실행될 명령문 작성
EndIfNext
5. 선택된 시트의 내용 합치기
이전 시트합치기 강의에서 사용했던 명령문을 그대로 사용하여 선택된 시트의 내용을 병합합니다.
'// 스크린업데이트 및 파일 저장 알림 중단
Application.ScreenUpdating=False
Application.DisplayAlerts=False'// ..................'// 실행할 명령문 작성'// ..................'//스크린 업데이트 파일 저장 알림 활성화
Application.ScreenUpdating=True
Application.DisplayAlerts=True
8. 파일 병합하기 버튼에 사용된 전체 명령문
PrivateSub btnMerge_Click()Dim WB As Workbook
Dim WS As Worksheet: Dim toWS As Worksheet
Dim rng As Range
Dim i AsLong: i =0: Dim j AsLongDim endCol AsLong: Dim endRow AsLongDim strWS AsString'// 스크린업데이트 및 파일 저장 알림 중단
Application.ScreenUpdating=False
Application.DisplayAlerts=False'// 오류방지IfMe.lstWB.ListCount=0Then
MsgBox "병합할 파일을 선택하세요."ExitSubEndIf'// 파일병합Set toWS = ActiveSheet
j = toWS.Cells(toWS.Rows.Count, 1).End(xlUp).RowFor i =0ToMe.lstWB.ListCount-1Set WB = Application.Workbooks.Open(Me.lstWB.List(i))ForEach WS In WB.WorksheetsIf WS.NameLikeMe.txtFilter.Value&"*"ThenWith WS
endCol =.Cells(1, .Columns.Count).End(xlToLeft).Column
endRow =.Cells(.Rows.Count, 1).End(xlUp).RowSet rng =.Range(.Cells(2, 1), .Cells(endRow, endCol))
rng.Copy toWS.Cells(j, 1)
j = j + rng.Rows.CountEndWithEndIfNext
WB.CloseNext'// 안내메세지
MsgBox "파일 병합이 완료 되었습니다."
Unload Me'// 스크린업데이트 및 파일 저장 알림 활성화
Application.ScreenUpdating=True
Application.DisplayAlerts=TrueEndSub
파일 합치기 유저폼 실행을 위한 단축키 만들기
유저폼을 실행하기 위한 위한 명령문을 추가합니다.
아래 명령문을 복사한 뒤, 기존에 생성하였던 Module1 붙여넣기합니다.
Sub Merge_Workbook()
frmWBSelect.ShowEndSub
다시 엑셀 시트로 돌아온 뒤, 화면 상단의 [개발도구] – [매크로] 를 클릭하면 '매크로' 창이 출력됩니다. 매크로 창의 목록에서 방금 전에 추가한 Merge_Workbook을 선택한 뒤, [옵션] 버튼을 클릭합니다.
[개발도구] – [매크로] 를 클릭하여 방금 추가한 ‘Merge_Workbook’의 옵션을 선택합니다.매크로 옵션창이 출력되면, 해당 매크로를 실행하기 위한 단축키로 Ctrl + Shift + B 를 지정한 뒤 [확인] 버튼을 눌러 마무리합니다.
Merge_Workbook의 단축키를 Ctrl + Shift + B로 지정합니다.
엑셀 파일 합치기 매크로 완성 및 테스트
파일 합치기 매크로 작성이 완료되었습니다. 이제 단축키 Ctrl + Shift + B 키를 누르면 언제든지 원하는 파일과 각 파일의 특정 시트를 선택하여 내용을 병합할 수 있습니다.