이번에는 엑셀 VBA 기능을 이용해서 폴더 내 파일을 통합해보도록 하겠습니다.
이미 이전 발행 글 중에서 '파워쿼리' 및 '파이썬'을 통해 폴더 내 엑셀파일 통합하는 방법을 다루어보았는데요
엑셀 VBA는 파이썬을 못하시는 직장 동료에게는 파이썬보다 훨씬 공유하기가 좋고, 파워쿼리가 못하는 부분도 다룰 수 있어서 배워두면 도움되실 것 같습니다.
▼ 이전발행글은 참고 해주세요 ▼
2022.05.09 - [엑셀(Excel)] - [파워쿼리 5강] 엑셀 파일 병합_자동화 기본편
파워쿼리는 별도의 코드 없이 마우스만으로 쉽게 자동화가 가능합니다 !! 파워쿼리로 자동화 강추 드립니다.
[파워쿼리 5강] 엑셀 파일 병합_자동화 기본편
오늘은 자동화의 기본인 엑셀파일 병합에 대해서 배워보겠다. Python 등의 프로그래밍 언어나 VBA를 통해서 여러 개의 파일을 하나로 병합할 수 있으나 우리의 목적은 최단시간 최고효율이기 때문
serendipity77.tistory.com
2022.11.22 - [파이썬(Python)] - [파이썬/Python] 파이썬으로 폴더 내 엑셀파일 한번에 통합하기
파이썬을 이미 어느정도 아시는 분들은 파이썬 강추 드립니다
[파이썬/Python] 파이썬으로 폴더 내 엑셀파일 한번에 통합하기
안녕하세요 오늘은 파이썬으로 폴더 내 엑셀파일을 한번에 통합해보겠습니다. 최종 코드는 맨 아래에 넣어두었습니다 ! 엑셀로도 가능하지만, 여러 가지 방법을 알려드리고자 파이썬으로 하는
serendipity77.tistory.com
1. 문제상황 및 해결그림
- 한 폴더 내에 동일한 형태의 매출현황 데이터가 월별로 정리되어 있습니다.
- 예시를 위하여 데이터의 크기는 5행 정도로 작게 잡았습니다.
- 엑셀 파일 한 곳에 1 ~ 9월 전체 데이터를 통합하여 보고 싶습니다.
2. 경로 불러오기
- 해당 폴더의 경로를 먼저 불러옵니다.
- 경로 내에 파일을 읽어야 합니다.
Sub Mergefile()
'변수
Dim strPath As String, fName As String
'경로 불러오기
strPath = "D:\test" '해당되는 경로 지정
fName = Dir(strPath & "*.xls*") ' Dir은 엑셀폴더 반복해서 돌게 하는 역할
End Sub
- strPath라는 변수 내에 해당되는 폴더의 경로를 넣어주시면 됩니다.
- 경로는 파일이름이 있는 곳에 위치해 있습니다.
- 저 같은 경우에는 D드라이브 밑에 > 어딘가 밑에 > Blog_엑셀 > 엑셀_VBA 이런 형태로 경로인 것으로 보입니다.
- "*.xls*"에서 *는 앞에 무슨 문자가 오던지 신경쓰지 않겠다 라는 뜻입니다.
따라서, " ~~어떤 문자가 오던지.xlsx', " ~~어떤 문자가 오던지.xlsm', " ~~어떤 문자가 오던지.xls' 등 다양한 포맷의 형태를 부르겠다는 말입니다.
- Dir의 경우 폴더를 반복해서 도는 명령어 입니다.
3. 경로 내 폴더 없을 경우 종료
- 경로 내 폴더 없을 경우 종료되는 코드입니다.
If fName = "" Then
MsgBox "폴더 내 엑셀파일이 존재하지 않습니다."
Exit Sub
End If
- 메세지 박스로 "폴더 내 엑셀파일이 존재하지 않습니다."라는 창을 띄워준 후 VBA를 종료합니다.
4. 파일이 존재하면 빈 시트에 업데이트 해줍니다. (통합해주는 매크로)
- Do While ~ Loop 문으로 무한반복 해줍니다.
Do While fName <> "" '파일이 존재하는 동안 = 공백이 아닌 동안
Set wb = Workbooks.Open(Filename:=strPath & fName, UpdateLinks:=0)
'UpdateLinks:=0 다른 시트 파일 참조하는 경우, 확인창 뜨는 걸 막아두는 역할
Set rngS = wb.Sheets(1).UsedRange
Set rngS = rngS.Offset(1).Resize(rngS.Rows.Count - 1)
'행의 개수
cntRows = rngS.Rows.Count
Sheet1.Cells(Rows.Count, "a").End(3)(2).Resize(cntRows, 2) = rngS.Value '2는 열의 갯수 고정
Cells(Rows.Count, "c").End(xlUp).Offset(1) = fName
wb.Close 'Workbook종료
fName = Dir ' Dir로 파일 반복
Loop
- fName <> "" : 파일명이 빈칸이 아니라면 이라는 뜻으로 파일이 존재하면 ! 이라고 해석하고 사용하시면 됩니다.
- UpdateLinks:=0의 경우, 다른 시트 파일 참조하는 경우, 확인창 뜨는 걸 막아두는 역할을 합니다.
- rngS라는 Range 변수를 잡은 다음 Sheet1에서 사용되는 범위를 잡습니다.
- 저희는 머릿글 내용까지 들고올 필요가 없기 때문에 Resize로 범위를 수정해줍니다.
5. [최종] 전체코드 통합
Sub MergeFile_InFolder()
Dim strPath As String, fName As String
Dim wb As Workbook
Dim rngS As Range
Dim cntRows As Long
Application.ScreenUpdating = False '화면 업데이트 안보이게 해서 속도 향상(추천)
Application.DisplayAlerts = False '저장하시겠습니까? 등의 창 안나타나게 하는 것
Sheet1.UsedRange.Offset(1).Clear
strPath = "개별경로지정"
fName = Dir(strPath & "*.xls*") ' Dir은 엑셀폴더 반복해서 돌게 하는 역할
If fName = "" Then
MsgBox "폴더 내 엑셀파일이 존재하지 않습니다."
Exit Sub
End If
Do While fName <> "" '파일이 존재하는 동안 = 공백이 아닌 동안
Set wb = Workbooks.Open(Filename:=strPath & fName, UpdateLinks:=0)
'UpdateLinks:=0 다른 시트 파일 참조하는 경우, 확인창 뜨는 걸 막아두는 역할
Set rngS = wb.Sheets(1).UsedRange
Set rngS = rngS.Offset(1).Resize(rngS.Rows.Count - 1)
'행의 개수
cntRows = rngS.Rows.Count
Sheet1.Cells(Rows.Count, "a").End(3)(2).Resize(cntRows, 2) = rngS.Value '2는 열의 갯수 고정
Cells(Rows.Count, "c").End(xlUp).Offset(1) = fName
wb.Close 'Workbook종료
fName = Dir ' Dir로 파일 반복
Loop
Sheet1.Range("a1").CurrentRegion.Borders.LineStyle = 1 '테두리 그려주는 옵션
Application.ScreenUpdating = True '상단에 False명령어 원상복귀
Application.DisplayAlerts = True '상단에 False명령어 원상복귀
End Sub
- 변수 등은 별도로 설명드리지 않았습니다.
결과를 확인해보면 파일 통합이 정상적으로 진행됨을 알 수 있습니다.
많이 활용하시길 바랍니다.
'엑셀(Excel) > VBA' 카테고리의 다른 글
[엑셀VBA] 필터별로 파일 분리해서 저장하기 (0) | 2023.11.12 |
---|---|
[엑셀VBA] 셀 입력 시 자동으로 현재시간 반환해보기(출석체크 용도 등) (0) | 2022.12.14 |
[엑셀/VBA] 엑셀 불필요한 데이터(행) 삭제 및 중복데이터 삭제 및 정렬 (1) | 2022.11.27 |
[엑셀] 시트별 데이터 통합하기(엑셀VBA활용) (0) | 2022.10.24 |
댓글