하나의 엑셀(.xlsx) 파일 안에 여러 개의 시트가 있을 때, 특정 시트별로 별도 파일(.xlsx)로 저장해야 하는 상황이 종종 있습니다. 예를 들어, 부서별·월별 보고서가 한 파일에 통합되어 있는 경우, 부서별 담당자에게 개별 파일을 배포하려면 ‘시트 분리 저장’이 필요한데요. 오늘은 수작업(매뉴얼)으로 분리 저장하는 방법, VBA 매크로를 활용한 자동화 방법, 파워셸(혹은 Python) 스크립트를 활용한 방법을 정리해 보았습니다.
1. 수작업(매뉴얼)으로 분리 저장하기
가장 간단하지만 파일 수가 많을 경우 번거로운 방법입니다.
- 분리할 시트를 마우스 우클릭 → [이동 또는 복사(M)…] 선택
- 대화상자에서
- ‘통합 문서: (새 통합 문서)’
- ‘복사본 만들기’ 체크
- [확인] 클릭
- 새로 열린 통합 문서에서 [파일] → [다른 이름으로 저장]
- “원본파일명_시트명.xlsx” 등 규칙적인 파일명 지정 후 저장
- 나머지 시트도 동일한 절차로 반복
장점
- 별도 프로그램 설치 불필요
- 초보자도 쉽게 수행 가능
단점
- 시트가 많은 경우 수작업 반복으로 시간 소모
- 파일명 일괄 지정이 번거로움
2. VBA 매크로로 자동 분리 저장하기
시트 수가 많거나 정기적으로 반복할 때 VBA를 쓰면 클릭 한 번으로 끝납니다.
2.1. VBA 매크로 코드 예제
- 엑셀에서
Alt + F11눌러 VBA 편집기 실행 - [삽입] → [모듈] 클릭
- 아래 코드를 복사·붙여넣기
Sub SplitSheetsToWorkbooks()
Dim ws As Worksheet
Dim wbSrc As Workbook
Dim wbNew As Workbook
Dim savePath As String
' 원본 통합 문서
Set wbSrc = ThisWorkbook
' 저장할 폴더 지정 (뒤에 \ 붙이기)
savePath = wbSrc.Path & "\Separated\"
' 폴더 없으면 생성
If Dir(savePath, vbDirectory) = "" Then
MkDir savePath
End If
Application.ScreenUpdating = False
For Each ws In wbSrc.Worksheets
ws.Copy ' 새 통합 문서로 복사
Set wbNew = ActiveWorkbook
' 파일명: 원본파일명_시트명.xlsx
wbNew.SaveAs Filename:=savePath & _
wbSrc.Name & "_" & ws.Name & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook
wbNew.Close SaveChanges:=False
Next ws
Application.ScreenUpdating = True
MsgBox "분리 저장 완료! 경로: " & savePath, vbInformation
End Sub
F5키로 매크로 실행
2.2. 주요 포인트
- savePath: 현재 파일과 같은 폴더 아래 ‘Separated’ 폴더를 자동 생성
- 파일명 패턴: “[원본파일명]_[시트명].xlsx”
.Copy메서드로 각 시트를 새 워크북으로 분리
장점
- 대량 분리 저장 시 시간 절약
- 폴더·파일명 자동화
단점
- 매크로 보안 설정 필요 (매크로 사용 승인)
- 간단한 코드 수정 필요 시 VBA 지식 요구
3. 스크립트(파워셸 / Python)로 분리 저장하기
3.1. 파워셸 예제
# Excel COM 객체 생성
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
# 원본 파일 열기
$wb = $excel.Workbooks.Open("C:\Path\원본파일.xlsx")
$savePath = Split-Path $wb.FullName -Parent + "\Separated"
if (!(Test-Path $savePath)) { New-Item -ItemType Directory -Path $savePath }
foreach ($ws in $wb.Worksheets) {
$ws.Copy()
$newWb = $excel.ActiveWorkbook
$fileName = "$($wb.Name.Replace('.xlsx',''))_$($ws.Name).xlsx"
$newWb.SaveAs("$savePath\$fileName",51) # 51 = xlOpenXMLWorkbook
$newWb.Close($false)
}
$wb.Close($false)
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
Write-Host "분리 저장 완료: $savePath"
3.2. Python(openpyxl) 예제
from openpyxl import load_workbook, Workbook
import os
src = "C:/Path/원본파일.xlsx"
wb = load_workbook(filename=src)
save_dir = os.path.join(os.path.dirname(src), "Separated")
os.makedirs(save_dir, exist_ok=True)
for sheet_name in wb.sheetnames:
src_ws = wb[sheet_name]
new_wb = Workbook()
new_ws = new_wb.active
new_ws.title = sheet_name
# 데이터 복사
for row in src_ws.rows:
for cell in row:
new_ws[cell.coordinate].value = cell.value
fname = f"{os.path.splitext(os.path.basename(src))[0]}_{sheet_name}.xlsx"
new_wb.save(os.path.join(save_dir, fname))
print("분리 저장 완료:", save_dir)
장점
- 엑셀이 설치되지 않은 환경에서도(파워셸은 COM 필요)
- 개발자 친화적, 다양한 커스터마이징 가능
단점
- 스크립트 실행 환경 설정이 필요
- 첫 준비가 다소 번거로울 수 있음
결론 및 팁
- 파일 수가 적고 수시로 분리할 땐 → 수작업
- 주기적으로 대량 분리할 땐 → VBA 매크로
- 엑셀 자동화·외부 연계가 필요할 땐 → 파워셸 / Python
- 저장 전 시트명에 파일명으로 사용할 수 없는 문자(\ / : * ? ” < > |)가 있는지 확인
- VBA나 스크립트 실행 전 반드시 백업 권장
- 협업 시 매크로 보안, 스크립트 권한 이슈 체크
위 방법들을 상황에 맞게 활용해 보세요. 엑셀 내 반복 업무를 자동화하면 업무 효율이 크게 상승합니다.