엑셀 시트 나눠서 저장 매크로 :: Save_EachWS 명령문 사용법
엑셀 Save_EachWS 명령문 목차 바로가기
요약
엑셀 Save_EachWS 는 통합문서의 각 시트를 여러개의 파일로 나누어 저장하는 명령문입니다.
명령문 구문
Save_EachWS [파일경로], [시트명], [덮어쓰기여부], [제외할시트]
사용된 인수 및 변수 알아보기
| 인수 | 설명 |
| 파일경로 [String, 선택인수] |
각 시트를 나누어 저장할 파일 경로입니다. 기본값은 실행중인 통합문서와 동일한 경로입니다. |
| 시트명 [String, 선택인수] |
시트명을 지정하면 모든 파일의 시트 이름이 동일하게 저장됩니다. 기본값은 해당 시트 이름을 그대로 유지합니다. |
| 덮어쓰기여부 [Boolean, 선택인수] |
TRUE 일 경우, 기존 파일 존재시 파일을 덮어쓰기 합니다. 기본값은 False 입니다. 덮어쓰기여부가 False이면서 기존파일이 존재할 경우, 파일명-1, 파일명-2, .. 로 파일명에 순번을 매겨 저장합니다. |
| 제외할시트 [String, 선택인수] |
시트 나누기에서 제외할 시트 목록입니다. 제외할 시트를 쉼표(,) 로 나누어 입력합니다. |
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [엑셀VBA함수] Save_EachWS 명령문예제파일
상세 설명
엑셀 Save_EachWS 명령문은 실행 중인 통합문서의 각 시트를 나누어 여러개의 통합문서로 저장하는 엑셀 시트 나누기 매크로 명령문입니다. 시트에 입력된 범위를 여러개의 시트로 나누려면 Split_EachWS 명령문을 사용하세요.
보조 명령문으로 파일 존재여부를 확인하는 FileExists 명령문과 파일명에 순번을 매겨 저장하는 FileSequence 명령문이 사용되었습니다.
만약 각 시트별로 분할 된 통합문서를 바탕화면에 저장하려면 GetDesktopPath 함수를 사용하여 파일경로를 바탕화면으로 지정할 수 있습니다.
Save_EachWS GetDesktopPath
'실행중인 통합문서의 각 시트를 여러개의 통합문서로 나눠서 바탕화면에 저장합니다.실전 사용 예제
- 통합문서의 각 시트를 나눠서 통합문서와 동일한 경로에 저장
Sub Test1() '통합문서의 각 시트를 나누어 통합문서와 동일한 경로에 저장합니다. Save_EachWS End Sub
- 통합문서에서 '시트1'과 '시트2'는 제외한 채, 나머지 시트를 나누어 바탕화면에 저장
Sub Test2() '통합문서에서 '시트1'과 '시트2'는 제외한 나머지 시트를 나누어 바탕화면에 저장합니다. Save_EachWS GetDesktopPath, , "시트1,시트2" End Sub
엑셀 시트나눠서 저장 매크로, Save_EachWS 명령문 동작원리
Save_EachWS 명령문 전체 코드
Sub Save_EachWS(Optional SavePath As String, Optional SheetName As String, Optional isOverWrite As Boolean = False, Optional ExcludeSheets As String) '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ Save_EachWS 함수 '▶ 각 시트를 각각의 통합문서로 나누어 저장합니다. '▶ 인수 설명 '_____________SavePath : 시트를 나누어 통합문서로 저장할 폴더경로입니다. 기본값은 실행중인 통합문서와 동일한 경로입니다. '_____________isOverWrite : 덮어쓰기 여부입니다. 기본값은 False 입니다. '_____________ExcludeSheets : 시트 나누기에서 제외할 시트입니다. 쉼표로 나누어 여러개 시트를 지정할 수 있습니다. '▶ 보조 명령문 안내 : FileExist, FileSequence 함수 '############################################################### Dim WS As Worksheet Dim FPath As String Dim vSheets As Variant: Dim vSheet As Variant If SavePath = "" Then SavePath = Application.ActiveWorkbook.Path If ExcludeSheets <> "" Then vSheets = Split(ExcludeSheets, ",") Application.ScreenUpdating = False Application.DisplayAlerts = False For Each WS In ThisWorkbook.Sheets If ExcludeSheets <> "" Then For Each vSheet In vSheets If WS.Name = Trim(vSheet) Then GoTo Pass: End If Next End If WS.Copy FPath = SavePath & "\" & WS.Name & ".xlsx" If FileExists(FPath) And isOverWrite = False Then FPath = FileSequence(FPath) End If Application.ActiveWorkbook.SaveAs Filename:=FPath If SheetName <> "" Then Application.ActiveWorkbook.Worksheets(1).Name = SheetName Application.ActiveWorkbook.Close True Pass: Next Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub Public Function FileExists(ByVal path_ As String) As Boolean '######################################################## '입력한 파일경로에 파일 존재여부를 확인합니다. 'https://www.oppadu.com/vba-fileexists-함수/ '######################################################## FileExists = (Dir(path_, vbDirectory) <> "") End Function Private Function FileSequence(FilePath As String, Optional Sequence As Long = 1, Optional Delimiter As String = "-") As String '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ FileSequence 함수 '▶ 기존 파일이 존재할 경우 순번을 매겨 파일을 저장합니다. '▶ 인수 설명 '_____________FilePath : 확장자를 포함한 파일 경로입니다. '_____________Sequence : 순번을 매길 시작번호입니다. '_____________Delimiter : 파일명과 순번을 구분할 구분자입니다. '▶ 보조 명령문 안내 : FileExist 함수 '############################################################### Dim Ext As String: Dim Path As String: Dim newPath As String Dim Pnt As Long Pnt = InStrRev(FilePath, ".") Path = Left(FilePath, Pnt - 1) Ext = Right(FilePath, Len(FilePath) - Pnt + 1) newPath = Path & Delimiter & Sequence & Ext Do Until FileExists(newPath) = False Sequence = Sequence + 1 newPath = Path & Delimiter & Sequence & Ext Loop FileSequence = newPath End Function
엑셀 시트 나눠서 저장 명령문 단계별 알아보기
- 명령문에 사용할 변수를 선언하고 각 변수 안에 값을 입력합니다.
Dim WS As Worksheet Dim FPath As String Dim vSheets As Variant: Dim vSheet As Variant If SavePath = "" Then SavePath = Application.ActiveWorkbook.Path If ExcludeSheets <> "" Then vSheets = Split(ExcludeSheets, ",")
- 빠른 동작을 위해 화면업데이트를 중단하고 통합문서 생성/종료를 위해 알림창을 비활성화합니다.
Application.ScreenUpdating = False Application.DisplayAlerts = False
- 시트가 제외할 시트일 경우 명령문을 중단하고 다음 단계로 넘어갑니다.
For Each WS In ThisWorkbook.Sheets For Each vSheet In vSheets If WS.Name = Trim(vSheet) Then GoTo Pass: End If Next
- 제외할 시트가 아닐 경우 시트를 통합문서로 저장합니다.
WS.Copy FPath = SavePath & "\" & WS.Name & ".xlsx" If FileExists(FPath) And isOverWrite = False Then FPath = FileSequence(FPath) End If Application.ActiveWorkbook.SaveAs Filename:=FPath Application.ActiveWorkbook.Close False Pass: Next
- 화면업데이트 및 알림창을 활성화 한 후 명령문을 종료합니다.
Application.DisplayAlerts = True Application.ScreenUpdating = True
- 통합문서의 각 시트를 나눠서 통합문서와 동일한 경로에 저장

매크로초보자입니다. 올려주신 코드에 대해 한줄씩 설명문을 써주시면 아주
감사하겠습니다.
有益な情報をたくさんありがとうございます!
大変恐縮ではございますが、コートについてもう少し詳しく説明文を添えて頂けたら凄くありがたいです!
From 해바라기
그냥 실행만시켰는데 그래서 뭐가 잘못한건지 궁금합니다 ㅎ
또는 파일 경로가 255자를 넘을 경우 오류가 발생할 수 있습니다.
아래 링크를 참고하여 매크로 코드를 한번 디버깅해보시겠어요?
https://www.oppadu.com/엑셀-vba-디버깅/
감사합니다.
예문에서 코드 복사해서 제가 들고있는파일 아무거나에 Test 해보려고했는데
전체 구문에서
Sub Test()
Save_EachWS , , "안내,시트"
End Sub
요부분만 삭제하면 Save_EachWS를 매크로로 쓸수 있는 것이 아닌가요..?
매크로 이름에 아무것도 안뜨네요..ㅠ
아니면 통채로가 한 셋트일까요..?
에 작성된 코드를 복사해서 사용하시면 됩니다.^^
Test 는 동작이 잘 동작하는지 테스트하는 코드입니다.
감사합니다.
해당 코드로 각 시트를 pdf로 저장하고 싶은데, 초보인지라 어렵네요.
코드를 어떻게 변환하면 좋을지 문의드립니다.
시트 → PDF 변환은 아래 강의를 참고해보시길 바랍니다.
https://www.oppadu.com/%ec%97%91%ec%85%80-pdf-%ec%9e%90%eb%8f%99-%ec%a0%80%ec%9e%a5-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8/
코드를 붙여넣으신 후, 실행할 매크로를 올바르게 선택하셨는지 한번 확인해보시겠어요?
[개발 도구] 탭 - [매크로]를 클릭해서 매크로 목록에 Save_EachWS가 보이는지 확인하시고,
만약 목록에 보이지 않는다면 코드가 '모듈'이 아닌 다른 위치(예: ThisWorkbook)에 붙여넣어진 것은 아닌지도 확인해보세요.
감사합니다.