오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴

엑셀 시트 나누기 매크로 :: Save_EachWS 명령문 사용법

각 시트를 나누어 각각의 통합문서로 저장하는 Save_EachWS 명령문의 사용법 및 동작원리를 살펴봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2021. 12. 02. 21:57
URL 복사
메모 남기기 : (10)

엑셀 시트 나눠서 저장 매크로 :: Save_EachWS 명령문 사용법

엑셀 Save_EachWS 명령문 목차 바로가기
요약

엑셀 Save_EachWS 는 통합문서의 각 시트를 여러개의 파일로 나누어 저장하는 명령문입니다.

명령문 구문
Save_EachWS [파일경로], [시트명], [덮어쓰기여부], [제외할시트]
사용된 인수 및 변수 알아보기
인수 설명
파일경로
[String, 선택인수]
각 시트를 나누어 저장할 파일 경로입니다. 기본값은 실행중인 통합문서와 동일한 경로입니다.
시트명
[String, 선택인수]
시트명을 지정하면 모든 파일의 시트 이름이 동일하게 저장됩니다. 기본값은 해당 시트 이름을 그대로 유지합니다.
덮어쓰기여부
[Boolean, 선택인수]
TRUE 일 경우, 기존 파일 존재시 파일을 덮어쓰기 합니다. 기본값은 False 입니다. 덮어쓰기여부가 False이면서 기존파일이 존재할 경우, 파일명-1, 파일명-2, .. 로 파일명에 순번을 매겨 저장합니다.
제외할시트
[String, 선택인수]
시트 나누기에서 제외할 시트 목록입니다. 제외할 시트를 쉼표(,) 로 나누어 입력합니다.

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.


상세 설명

엑셀 Save_EachWS 명령문은 실행 중인 통합문서의 각 시트를 나누어 여러개의 통합문서로 저장하는 엑셀 시트 나누기 매크로 명령문입니다. 시트에 입력된 범위를 여러개의 시트로 나누려면 Split_EachWS 명령문을 사용하세요.

보조 명령문으로 파일 존재여부를 확인하는 FileExists 명령문과 파일명에 순번을 매겨 저장하는 FileSequence 명령문이 사용되었습니다.

만약 각 시트별로 분할 된 통합문서를 바탕화면에 저장하려면 GetDesktopPath 함수를 사용하여 파일경로를 바탕화면으로 지정할 수 있습니다.

Save_EachWS GetDesktopPath
'실행중인 통합문서의 각 시트를 여러개의 통합문서로 나눠서 바탕화면에 저장합니다.
실전 사용 예제
  1. 통합문서의 각 시트를 나눠서 통합문서와 동일한 경로에 저장
    Sub Test1()
     
    '통합문서의 각 시트를 나누어 통합문서와 동일한 경로에 저장합니다.
    Save_EachWS
    End Sub
  2. 통합문서에서 '시트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
엑셀 시트 나눠서 저장 명령문 단계별 알아보기
  1. 명령문에 사용할 변수를 선언하고 각 변수 안에 값을 입력합니다.
    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, ",")
  2. 빠른 동작을 위해 화면업데이트를 중단하고 통합문서 생성/종료를 위해 알림창을 비활성화합니다.
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
  3. 시트가 제외할 시트일 경우 명령문을 중단하고 다음 단계로 넘어갑니다.
    For Each WS In ThisWorkbook.Sheets
        For Each vSheet In vSheets
            If WS.Name = Trim(vSheet) Then
                GoTo Pass:
            End If
        Next
  4. 제외할 시트가 아닐 경우 시트를 통합문서로 저장합니다.
        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
  5. 화면업데이트 및 알림창을 활성화 한 후 명령문을 종료합니다.
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
댓글 10
4.7 (6개 평가)
yuri
yuri 2021.06.14 14:02
안녕하세요 항상 좋은 정보를 제공해주셔서 감사합니다.
매크로초보자입니다. 올려주신 코드에 대해 한줄씩 설명문을 써주시면 아주
감사하겠습니다.
有益な情報をたくさんありがとうございます!
大変恐縮ではございますが、コートについてもう少し詳しく説明文を添えて頂けたら凄くありがたいです!

From 해바라기
임영원
임영원 2022.08.23 19:33
예제팡리 다운받아서 사용해보려고 하는데 WS.COPY 구문에서 자꾸 디버그가 난다고 멈춥니다
그냥 실행만시켰는데 그래서 뭐가 잘못한건지 궁금합니다 ㅎ
오빠두엑셀
오빠두엑셀 작성자 2022.08.24 02:49
저장되지 않은 파일에서 코드를 실행하여 오류가 발생하는 듯 합니다.^^
또는 파일 경로가 255자를 넘을 경우 오류가 발생할 수 있습니다.
아래 링크를 참고하여 매크로 코드를 한번 디버깅해보시겠어요?
https://www.oppadu.com/엑셀-vba-디버깅/
감사합니다.
인생은즐거움
인생은즐거움 2022.11.02 10:21
안녕하세요
예문에서 코드 복사해서 제가 들고있는파일 아무거나에 Test 해보려고했는데
전체 구문에서
Sub Test()
Save_EachWS , , "안내,시트"
End Sub
요부분만 삭제하면 Save_EachWS를 매크로로 쓸수 있는 것이 아닌가요..?
매크로 이름에 아무것도 안뜨네요..ㅠ
아니면 통채로가 한 셋트일까요..?
오빠두엑셀
오빠두엑셀 작성자 2022.11.03 14:42
Save_EachWS 명령문 전체 코드
에 작성된 코드를 복사해서 사용하시면 됩니다.^^
Test 는 동작이 잘 동작하는지 테스트하는 코드입니다.
감사합니다.
택택택
택택택 2023.11.29 17:46
안녕하세요.
해당 코드로 각 시트를 pdf로 저장하고 싶은데, 초보인지라 어렵네요.
코드를 어떻게 변환하면 좋을지 문의드립니다.
오빠두엑셀
오빠두엑셀 작성자 2023.11.30 00:14
안녕하세요.
시트 → 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/
강민준🤗
강민준🤗 2024.08.11 12:57
좋은 자료 감사합니다.🙇‍♂️
쭈루루
쭈루루 2026.02.24 15:55
코드 전체를 복사해서 매크로 모듈에 붙였는데, 실행이 안되네요ㅠ 이유가 뭘까요?
오빠두엑셀
오빠두엑셀 작성자 2026.03.09 19:14
안녕하세요.
코드를 붙여넣으신 후, 실행할 매크로를 올바르게 선택하셨는지 한번 확인해보시겠어요?
[개발 도구] 탭 - [매크로]를 클릭해서 매크로 목록에 Save_EachWS가 보이는지 확인하시고,
만약 목록에 보이지 않는다면 코드가 '모듈'이 아닌 다른 위치(예: ThisWorkbook)에 붙여넣어진 것은 아닌지도 확인해보세요.
감사합니다.