엑셀·구글시트 자동화 실험No. 278
엑셀 표를 PDF로 일괄 저장하는 매크로가 필요한 순간

여러 시트의 인쇄 영역을 각각 저장합니다

짚고 가기
PDF 저장 단위
- 시트 하나당 PDF 하나
- 저장 범위는 인쇄 영역
- 표별 저장은 별도 구성
이 작업에서 먼저 정할 내용은 저장 단위입니다. 여기서는 시트 하나를 PDF 파일 하나로 저장합니다. 시트 안에 표가 여러 개 있어도 지정된 인쇄 영역을 함께 내보내므로, 표마다 파일을 나누려는 작업에는 별도 구성이 필요합니다.
원본은 매크로 사용 통합 문서인 xlsm 형식으로 저장합니다. 코드는 데스크톱용 Windows Excel을 기준으로 작성합니다. 웹용 Excel에서는 VBA를 실행할 수 없으며, 구글시트에도 이 코드를 그대로 붙여 넣어 실행하지 못합니다.
인쇄 영역은 각 시트에서 저장할 셀 범위를 선택한 다음 페이지 레이아웃 메뉴에서 지정합니다. 용지 방향과 여백도 함께 설정합니다. 가로로 긴 표를 한 페이지 너비에 맞출 수 있지만, 글자가 지나치게 작아지는지는 인쇄 미리 보기에서 확인합니다. 세로까지 한 페이지로 줄이면 행이 많은 문서를 읽기 어려울 수 있습니다.
- 원본 사본을 만들고 xlsm 형식으로 저장합니다
- 저장할 시트마다 인쇄 영역과 용지 설정을 확인합니다
- Alt+F11을 누르고 삽입 메뉴에서 모듈을 추가합니다
- 아래 코드를 붙여 넣고 Alt+F8에서 SaveSheetsAsPDF를 실행합니다
- 저장 폴더를 선택하고 생성된 PDF를 확인합니다
매크로 실행 허용 여부는 파일의 출처와 조직의 보안 정책에 따라 판단합니다. 실행이 차단된다면 전체 보안 수준부터 낮추기보다 해당 파일을 사용할 수 있는 환경인지 확인합니다.
PDF를 나누는 단위는 시트이며, 저장할 범위는 각 시트의 인쇄 영역으로 정합니다.
모듈에 붙여 넣는 전체 코드입니다
아래 코드는 표준 모듈에 통째로 넣습니다. 같은 모듈 안에 SaveSheetsAsPDF와 CleanFileName이 함께 있어야 합니다. 코드 안의 영문 이름은 그대로 사용합니다.

하나씩 확인
코드 배치 확인
- 표준 모듈에 전체 코드
- 두 프로시저 함께 배치
- 영문 이름 그대로 사용
Option Explicit
Sub SaveSheetsAsPDF()
Dim ws As Worksheet
Dim folder As String
Dim filePath As String
Dim saved As Long
Dim skipped As Long
On Error GoTo Failed
With Application.FileDialog(4)
.Title = "PDF 저장 폴더 선택"
.AllowMultiSelect = False
If .Show <> -1 Then Exit Sub
folder = .SelectedItems(1)
End With
If Right$(folder, 1) <> "\" Then
folder = folder & "\"
End If
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then
If Len(ws.PageSetup.PrintArea) > 0 Then
filePath = folder & CleanFileName(ws.Name) & ".pdf"
If Len(Dir$(filePath)) = 0 Then
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=filePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
saved = saved + 1
Else
skipped = skipped + 1
End If
Else
skipped = skipped + 1
End If
Else
skipped = skipped + 1
End If
Next ws
MsgBox "저장: " & saved & "개" & vbCrLf & _
"건너뜀: " & skipped & "개"
Exit Sub

이렇게
오류 발생 시 처리
- 남은 시트 처리 중단
- 오류 설명 표시
- 저장 완료 개수 표시
Failed:
MsgBox "작업을 중단합니다." & vbCrLf & _
"오류: " & Err.Description & vbCrLf & _
"저장 완료: " & saved & "개"
End Sub
Private Function CleanFileName(ByVal s As String) As String
Dim item As Variant
For Each item In Array("\", "/", ":", "*", "?", """", "<", ">", "|")
s = Replace(s, CStr(item), "_")
Next item
CleanFileName = s
End Function
이 코드는 실행 결과를 측정해 제시하는 예제가 아닙니다. 실제 파일의 인쇄 설정과 저장 권한에 따라 결과가 달라지므로, 원본 사본과 비어 있는 저장 폴더를 이용해 먼저 확인합니다.
시트 선택부터 파일 생성까지 읽습니다
ThisWorkbook은 현재 화면에서 선택한 파일이 아니라 매크로 코드가 들어 있는 통합 문서입니다. 따라서 이 코드를 개인용 매크로 통합 문서에 넣으면 의도한 파일을 처리하지 못합니다. 저장할 시트가 들어 있는 파일의 모듈에 넣는 구성이 전제입니다.
FileDialog(4)는 저장할 폴더를 선택하는 창을 엽니다. 취소하면 파일을 만들지 않고 종료합니다. 폴더를 선택한 뒤에는 각 워크시트를 살펴보며, 숨겨진 시트와 인쇄 영역이 없는 시트를 제외합니다.
filePath에는 선택한 폴더와 시트 이름을 합친 파일명이 들어갑니다. CleanFileName은 파일명에 사용할 수 없는 문자를 밑줄로 바꿉니다. 서로 다른 시트 이름이 문자 치환 뒤 같은 이름이 될 수 있으므로, 파일명 중복 검사를 함께 사용합니다.
Dir$는 해당 이름의 파일이 있는지 확인합니다. 이미 있으면 덮어쓰지 않고 건너뜀 수에 더합니다. 실행 후 표시되는 건너뜀 수에는 숨겨진 시트와 인쇄 영역이 없는 시트도 포함되므로, 이 숫자가 모두 중복 파일을 뜻하지는 않습니다.

상황별 저장 동작
| 구분 | 동작 |
|---|---|
| 같은 이름 파일 | 건너뜀에 포함 |
| 인쇄 영역 | 지정 범위 출력 |
| 생성한 PDF | 바로 열지 않음 |
ExportAsFixedFormat이 PDF를 만드는 부분입니다. IgnorePrintAreas:=False는 지정된 인쇄 영역을 따르고, OpenAfterPublish:=False는 생성한 PDF를 바로 열지 않도록 합니다. IncludeDocProperties:=False는 문서 속성을 포함하지 않는 설정이며, 셀에 적힌 내용은 그대로 출력 대상입니다.
오류가 발생하면 남은 시트 처리를 중단하고 오류 설명을 표시합니다. 앞에서 생성한 PDF는 남아 있습니다. 저장 폴더의 쓰기 권한이나 같은 파일을 다른 프로그램이 사용 중인지 살핀 뒤, 중단 지점까지 만들어진 파일도 함께 확인합니다.
저장 단위와 반복 실행 방식을 조정합니다
시트별로 별도 파일이 필요한 경우에는 현재 구조를 사용합니다. 여러 시트를 한 PDF로 묶어야 하는 경우에는 출력할 시트를 지정하고 한 번에 내보내는 구조가 필요합니다. 한 시트 안의 여러 표를 각각 저장하려면 표별 셀 범위와 파일명을 연결하도록 코드를 바꿉니다.
반복 실행할 때는 기존 파일 처리 방식을 먼저 정합니다. 현재 코드는 같은 이름을 건너뛰므로, 셀 내용을 수정하고 다시 실행해도 기존 PDF가 최신 내용으로 바뀌지 않습니다. 실행마다 새 폴더를 선택하거나, 이전 결과를 별도로 정리한 뒤 실행하는 방식으로 구분합니다.
같은 이름의 PDF가 있으면 건너뛰므로, 다시 실행해도 수정 내용이 자동 반영되지는 않습니다.
파일이 만들어졌는데 빈 페이지가 섞이면 인쇄 영역에 불필요한 셀이 포함됐는지 확인합니다. 표 오른쪽이 잘리면 용지 방향과 배율을 살핍니다. 여러 페이지로 나뉘는 문서에서는 제목 행 반복 설정도 확인합니다. 매크로는 현재 인쇄 설정을 사용하므로, 저장 동작과 문서 배치는 나누어 점검합니다.
PDF는 저장 시점의 출력 결과입니다. 원본 수식을 다시 계산하거나 셀을 편집하는 용도로 쓰는 파일은 아니므로, 수정 가능한 원본도 함께 관리합니다. 수식 결과가 예상과 다르면 계산 상태를 확인한 뒤 내보냅니다.
엑셀·구글시트 자동화 실험에서는 이런 작업의 판단 기준을 입력 범위와 출력 단위에 둡니다. 먼저 저장 대상과 파일 이름 규칙을 정하고, 생성된 PDF에서 잘림과 누락을 확인합니다. 처리 속도는 시트 수와 문서 구성에 따라 달라지므로, 기준을 정해 직접 측정합니다.
· 7분