엑셀 VBA 자동화 (24편): 행 데이터를 한 줄씩 쪼개어 서식 시트에 맞춰 개별 파일로 분리 저장하기
실무 자동화를 진행하다 보면 단순히 시트를 분할하는 수준을 넘어, 미리 정해진 '양식(Form) 시트'에 데이터를 동적으로 매칭해야 하는 고난도 공정이 발생합니다. 예를 들어 가로로 길게 나열된 임직원 100명의 수당 데이터를 세로 형태의 정식 '급여지급 명세서' 서식의 적절한 위치에 자동으로 입력하고, 입력이 끝날 때마다 '홍길동_명세서.xlsx'라는 독립된 워크북 파일로 저장하여 출력하는 작업입니다. 이 메커니즘을 마스터하면 수작업으로 며칠이 걸리던 행정 정산 업무를 수 초 내에 완벽하게 완결할 수 있습니다.
1. 자동화 제어 프로그램 작성을 위한 개발 환경 세팅
이 매크로 프로그램을 구동하기 위해서는 파일 내에 최소 두 개의 시트가 필요합니다. 하나는 데이터가 나열된 "명부" 시트이고, 다른 하나는 멋지게 테두리와 결재란이 그려진 "서식" 시트입니다. 설정을 위해 키보드의 Alt + F11을 눌러 VBA 편집기를 연 뒤, 상단 메뉴의 [삽입(I)] - [모듈(M)]을 클릭하여 코드 창을 개설하고 아래의 마스터 소스코드를 오타 없이 복사하여 붙여넣습니다.
Dim wsData As Worksheet, wsForm As Worksheet
Dim wbNew As Workbook
Dim lastRow As Long, i As Long
Dim empName As String, savePath As String
Set wsData = ThisWorkbook.Sheets("명부")
Set wsForm = ThisWorkbook.Sheets("서식")
savePath = ThisWorkbook.Path & "\" '현재 파일과 같은 폴더에 생성
lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
' 2행부터 마지막 직원 행까지 순회 반복 실행
For i = 2 To lastRow
empName = wsData.Cells(i, 2).Value 'B열: 직원 이름
' 명부의 데이터를 서식 시트의 지정된 셀 위치에 매칭 매립
wsForm.Range("B4").Value = wsData.Cells(i, 1).Value '사번 -> 서식 B4
wsForm.Range("D4").Value = empName '성명 -> 서식 D4
wsForm.Range("B6").Value = wsData.Cells(i, 3).Value '부서 -> 서식 B6
wsForm.Range("D6").Value = wsData.Cells(i, 4).Value '금액 -> 서식 D6
' 값이 채워진 서식 시트만 복사하여 새로운 독립 워크북 파일 개설
wsForm.Copy
Set wbNew = ActiveWorkbook
' '성명_명세서.xlsx' 파일명으로 자동 저장 후 닫기
wbNew.SaveAs Filename:=savePath & empName & "_명세서.xlsx", FileFormat:=xlOpenXMLWorkbook
wbNew.Close SaveChanges:=False
Next i
Application.ScreenUpdating = True
MsgBox "모든 개인별 서식 파일 분리가 완료되었습니다!", vbInformation
End Sub
2. 매크로의 데이터 바인딩 알고리즘 해설
이 프로그램의 핵심 메커니즘은 wsForm.Copy 명령어에 숨어있습니다. 엑셀 워크시트 객체 뒤에 인수를 지정하지 않고 .Copy를 실행하면, 엑셀은 해당 시트의 디자인과 서식을 그대로 복사하여 메모리 상에 완전히 새로운 독립 엑셀 파일(Workbook)을 자동으로 개설해 줍니다. For...Next 루프문이 동작하면서 '명부' 시트의 2행부터 차례대로 데이터를 읽어와 '서식' 시트의 고정된 좌표(B4, D4 등)에 값을 꽂아 넣고, 복사 및 SaveAs 명령어를 통해 가동 폴더 내에 순식간에 독립적인 엑셀 결과물 파일들을 파편화하여 적재하는 고급 자동화 알고리즘입니다.
- 수식 참조 주의: 복사 대상인 "서식" 시트 내부에 다른 시트를 참조하는 수식이 걸려있다면, 파일이 분리될 때 링크가 깨져
#REF!에러가 날 수 있습니다. 서식 시트 내의 연산은 되도록 자체 셀 간의 계산으로만 완결되도록 설계하는 것이 안전합니다. - 중복 파일명 처리: 동명이인이 있을 경우 파일이 덮어써 질 위험이 있습니다. 이 경우 파일명을 지정하는 코드 부근을
empName & "_" & wsData.Cells(i, 1).Value & "_명세서.xlsx"처럼 이름 뒤에 사번을 붙이도록 커스텀하면 파일이 손실되는 에러를 방지할 수 있습니다. - 파일 사전 저장:
ThisWorkbook.Path는 현재 매크로 파일이 위치한 경로를 뜻합니다. 새로 만든 빈 문서에 코드를 바로 실행하면 경로를 찾지 못해 에러가 나므로, 반드시 원본 매크로 파일을 하드디스크에 한 번 저장한 뒤 실행해야 합니다.
데이터 시트 구성 및 대입 바인딩 좌표 구조
| 명부 원본 열 데이터 (A~D열) | 서식 시트 대입 목적지 좌표 | 최종 루프 제어 결과물 |
|---|---|---|
| A열 : 사원번호 (예: 202601) | "서식" 시트의 B4 셀로 자동 이동 | 김철수_명세서.xlsx 파일 생성 |
| B열 : 성명 (예: 김철수) | "서식" 시트의 D4 셀로 자동 이동 및 파일명 활용 | 이영희_명세서.xlsx 파일 생성 |
| C열 : 소속부서 (예: 재무팀) | "서식" 시트의 B6 셀로 자동 이동 | 박민수_명세서.xlsx 파일 생성 |
| D열 : 지급금액 (예: 5,000,000) | "서식" 시트의 D6 셀로 자동 이동 | 개별 파일에는 본인 데이터 서식만 존재 |
'코딩으로 시간 벌기 > 엑셀 VBA' 카테고리의 다른 글
| 엑셀 VBA 자동화 (26편): 파편화된 외부 파일들, 버튼 하나로 개별 시트에 똑똑하게 일괄 취합하기 (0) | 2026.05.29 |
|---|---|
| 엑셀 VBA 자동화 (25편): 지정 폴더 내 수많은 엑셀 파일들, 버튼 하나로 마스터 시트에 자동 취합하기 (0) | 2026.05.26 |
| 엑셀 VBA 자동화 (23편): 버튼 하나로 마스터 데이터에서 부서별 독립 엑셀 파일 일괄 분리 저장하기 (1) | 2026.05.19 |
| 엑셀 VBA 자동화 (22편): 인사 명부 리스트대로 폴더 1초 만에 자동 생성하기 (0) | 2026.05.15 |
| 엑셀 VBA 자동화 (21편): 보고서 정제의 기본! 수천 줄의 지출결의서에서 빈 행만 1초 만에 일괄 삭제하기 (0) | 2026.05.12 |
