사용자가 원하는 파일을 쉽게 선택할 수 있도록 사용자 정의 유저폼을 추가합니다. 예제파일을 다운받은 뒤 개발도구 - 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 키를 누르면 언제든지 원하는 파일과 각 파일의 특정 시트를 선택하여 내용을 병합할 수 있습니다.
안녕하세요! 유투브에서부터 잘 보고 사이트까지 들어와서 많이 배우고 있습니다.
그런데 문의드리고 싶은 내용이 있는데, 파일합치기 이후에 각 데이터의 가장 오른쪽에 새로운 컬럼을 만들어서 각 데이터의 출처 파일명도 같이 입력하게 할 수 있을까요? 예시파일로 보면, 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
답변이 도움이 되셨길 바랍니다.
chicchick2020.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
으로 변경해보세요.
chicchick2020.05.18 17:13
오오! 해결되었네요 ㅎㅎㅎ! 정말 감사합니다 ㅎㅎ 큰 도움이 되었어요.
김정민2020.05.19 13:12
안녕하세요, 강의 영상 및 자료 매우 유용하게 사용하고 있습니다. 감사합니다.
한가지 여쭤보고 싶은게, 불러온 파일들의 내용을 같은열에 쌓지 않고, 다른열에 순서대로 불러올수 있을까요?
예를들어 각 파일의 H열을 병합하는 파일 A열부터 차례로 쌓고 싶은데.. 알려주시면 감사하겠습니다.
오빠두엑셀작성자2020.05.19 15:32
안녕하세요?
코드를 수정하려면 어느정도 매크로에 대한 공부를 하셔야 하는데요.
아래 부분을
정말 좋은 강의 무료로 나누어주셔서 정말 감사합니다!
그런데 문의드리고 싶은 내용이 있는데, 파일합치기 이후에 각 데이터의 가장 오른쪽에 새로운 컬럼을 만들어서 각 데이터의 출처 파일명도 같이 입력하게 할 수 있을까요? 예시파일로 보면, F열에 '파일명' 컬럼이 생기는 결과로 만들려고 합니다. Thisworkbookname으로 해보려고 했는데 매크로를 실행하는 엑셀의 파일명만 입력이 되네요.
아래 명령문을,
아래와 같이 수정해보시겠어요?
적절히 수정하여 사용하시면 될 듯 합니다.^^
답변이 도움이 되셨길 바랍니다.
1. Data의 출처가 아닌, Data를 취합하는 Sheet의 이름이 입력됩니다.
2. Sheet명이 아닌 파일명 입력을 하려고 합니다.
2번은 작은 문제이겠지만 1번이 난감하네요. 바쁘시겠지만 도움주실 수 있으시면 댓글 부탁드려요!
위에 명령문을
으로 변경해보세요.
한가지 여쭤보고 싶은게, 불러온 파일들의 내용을 같은열에 쌓지 않고, 다른열에 순서대로 불러올수 있을까요?
예를들어 각 파일의 H열을 병합하는 파일 A열부터 차례로 쌓고 싶은데.. 알려주시면 감사하겠습니다.
코드를 수정하려면 어느정도 매크로에 대한 공부를 하셔야 하는데요.
아래 부분을
아래와 같이 상황에 맞춰 적절히 수정하시면 됩니다.^^
답변이 도움이 되셨길 바랍니다.
감사합니다.
상황에 맞게 코드를 응용하시려면 약간의 코딩 지식이 필요합니다 ^^;
그런데 파일병합시 다시 한번 파일병합을 하면 이전에 병합했던 맨 마지막 데이터에 새로운 병합파일이 덮어져서, 맨 마지막 데이터가 사라지는 현상이 있습니다. 이건 어떻게 해결할수 있을까요?
유용한 강의 올려 주셔서 너무 감사합니다.
으로 뒤에 숫자를 더해보시길 바랍니다.^^
모든 파일의 첫번째 시트만 가져오려고 하면 어떻게 수정해야할까요?
답변 부탁드립니다 ~
전체 명령문에서 사용된 아래 코드를
아래와 같이 바꿔보세요.
다시 확인해보시길 바랍니다. :)
With WS 루프에서 복사한 내용을 기존에 존재하는 worksheet("WMS")에 붙여넣고 싶을어서
rng.Copy toWS부분을
rng.Copy Destination:=Worksheets("WMS").Cells(j, 39)로
고쳐봤는데 에러만 표시되네요.. 바쁜와중 대단히 죄송하지만, 좋은방법 있으면 알려주실 수 있으신지요..