엑셀 시트 나눠서 저장 매크로 :: 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
- 통합문서의 각 시트를 나눠서 통합문서와 동일한 경로에 저장