VBA PDF 내보내기: Report 인쇄 영역과 파일명 충돌을 확인하는 버튼

PDF 파일이 생겼다는 메시지는 보고서의 마지막 열이 잘리지 않았다는 증거가 아닙니다. 이번 작업은 Report 한 시트를 고정해 내보내고, 출력 전 미리보기와 출력 후 실제 PDF를 같은 기준으로 비교하는 것입니다. 여러 시트·UserForm·재귀 폴더 생성은 한 버튼에 섞지 않습니다.

이 자료는 실제 회사 보고서가 아닌 가상 월간보고입니다. Python으로 파일명·중단 조건을 참조 검산하고 코드의 API 인수를 대조했습니다. Microsoft Excel, VBA 또는 PDF 내보내기를 실제 실행하지 않았습니다. 첨부에는 결과 PDF를 만들어 넣지 않았습니다.

Report의 제목·1200·인쇄 영역과 PDF 생성·내용 확인을 분리한 설명 도해
Report의 제목·1200·인쇄 영역과 PDF 생성·내용 확인을 분리한 설명 도해. 가상 입력과 기대값을 설명한 그림이며 실제 Excel 실행 화면이나 실행 성공 증거가 아닙니다.

입력과 출력 전에 기록할 것

practice-84.xlsx의 Report!A1은 월간보고, A3:B3은 항목·금액, A4:B4는 예제·1200입니다. 숫자는 실제 업무 금액이 아닙니다. XLSX에는 매크로나 설정된 인쇄 영역이 없으므로 로컬 XLSM 사본에서 A1:G40을 인쇄 영역으로 직접 지정합니다.

확인 지점 기대 또는 직접 기록할 내용
제목 월간보고
금액 1200
인쇄 범위 Report!A1:G40
페이지 수 Excel 미리보기에서 관찰한 값
파일명 예시 Report_20260923_143005.pdf

파일명은 가상 시각 2026-09-23 14:30:05에 대한 계산 예입니다. 실제 실행 시각이라고 제시하지 않습니다. 페이지 수도 한 장이라고 고정하지 않습니다. 프린터·용지·여백·배율에 따라 달라질 수 있어 미리보기 결과를 확인기록 시트에 먼저 적습니다.

False를 읽을 때 옵션의 이름까지 봅니다

IgnorePrintAreas가 True이면 설정한 인쇄 영역을 무시하며, False이면 그 옵션을 켜지 않습니다. 따라서 코드의 IgnorePrintAreas:=False는 인쇄 영역을 무시하는 설정이 아닙니다. True의 동작을 False에 그대로 붙여 설명하면 의미가 뒤집힙니다. 인쇄 범위가 맞는지는 Report의 설정과 실제 출력으로 확인합니다.

PageSetup.PrintArea는 A1 형식 참조를 사용하는 문자열로 인쇄 범위를 읽고 씁니다. 이 코드가 빈 PrintArea를 중단시키는 것은 실습의 명시적 계약입니다. 빈 문자열 자체가 Excel에서 오류라는 뜻은 아닙니다. 의도치 않은 전체 시트 출력 대신 미리 범위를 선택하도록 요구합니다.

인쇄 미리보기부터 파일 충돌·PDF 크기·실제 내용 확인까지 여섯 단계의 설명 도해
인쇄 미리보기부터 파일 충돌·PDF 크기·실제 내용 확인까지 여섯 단계의 설명 도해. 가상 입력과 기대값을 설명한 그림이며 실제 Excel 실행 화면이나 실행 성공 증거가 아닙니다.

전체 모듈: 저장·시트·범위부터 확인합니다

Windows 경로를 사용하므로 Mac에서는 시작 단계에서 중단합니다. ThisWorkbook은 코드가 들어 있는 파일이며 Report를 명시해 활성 시트에 의존하지 않습니다. 아직 저장하지 않은 파일이나 웹 URL 경로는 거부합니다. 네트워크 공유·모든 경로 권한을 보증하는 검사는 아니므로 권한이 있는 로컬 연습 폴더만 사용합니다.

첫 Attribute VB_Name 줄은 BAS 가져오기용 메타데이터입니다. BAS를 가져올 때는 그대로 두고, 코드 창에 직접 붙여넣을 때는 이 첫 줄만 제외합니다.

Attribute VB_Name = "ArticleExamples"
Option Explicit

Public Sub ExportReportPdf()
    Dim ws As Worksheet
    Dim folder As String
    Dim target As String
    On Error GoTo Failed

    If InStr(1, Application.OperatingSystem, "Mac", vbTextCompare) > 0 Then
        Err.Raise vbObjectError + 1005, , "This example requires Windows desktop Excel."
    End If
    If ThisWorkbook.Path = "" Or InStr(ThisWorkbook.Path, "://") > 0 Then
        Err.Raise vbObjectError + 1000, , "Save a local copy of this workbook first."
    End If
    Set ws = ThisWorkbook.Worksheets("Report")
    If ws.PageSetup.PrintArea = "" Then
        Err.Raise vbObjectError + 1001, , "Set and preview the Report print area first."
    End If
    folder = ThisWorkbook.Path & "\PDF"
    If Dir(folder, vbDirectory) = "" Then MkDir folder
    target = folder & "\Report_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
    If Len(Dir$(target, vbNormal Or vbReadOnly Or vbHidden Or vbSystem Or vbDirectory)) > 0 Then
        Err.Raise vbObjectError + 1002, , "Target already exists. No overwrite attempted."
    End If

    ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=target, _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, OpenAfterPublish:=False
    If Dir(target) = "" Then Err.Raise vbObjectError + 1003, , "PDF was not created."
    If FileLen(target) = 0 Then Err.Raise vbObjectError + 1004, , "PDF is empty."
    MsgBox "Open the PDF and check pages and content: " & target, vbInformation
    Exit Sub
Failed:
    MsgBox "Export stopped. Error " & Err.Number & ": " & Err.Description, vbExclamation
End Sub

파일 생성 확인과 내용 확인은 다릅니다

출력은 통합 문서 옆 PDF 폴더 아래에 저장합니다. 그 폴더가 없으면 한 단계만 만듭니다. 파일명에 초까지 넣어도 같은 초의 재실행은 충돌할 수 있습니다. 호출 전에 같은 이름이 있으면 중단하며 기존 PDF를 삭제하지 않습니다. 여러 프로세스가 같은 경로에 동시에 저장하는 경합까지 잠그는 기능은 아닙니다.

본문의 중복 경로 검사는 읽기 전용·숨김·시스템 파일과 디렉터리 속성까지 명시했습니다. Microsoft Dir 문서에 따르면 속성을 생략한 기본 검색만으로 모든 속성의 항목을 확인했다고 볼 수 없습니다. 다운로드 ZIP의 ArticleExamples.bas도 현재 본문과 같은 코드입니다. 이전 ZIP을 쓰던 실습 사본에서는 전체 모듈을 현재 코드로 교체하세요. 검사 후 다른 프로그램이 같은 경로를 만드는 경쟁 상태는 여전히 막지 못합니다.

이 보완은 공식 API 정의와 코드 정적 검토를 기준으로 했으며 Windows Excel·실제 PDF 내보내기에서 실행한 결과는 아닙니다. 같은 이름의 일반 파일뿐 아니라 숨김 또는 읽기 전용 파일이 있는 연습 경로도 거부되는지 별도 사본에서 확인해야 합니다. 기존 파일 속성을 바꾸거나 덮어써 통과시키는 절차는 포함하지 않습니다.

파일 존재와 FileLen>0은 최소 확인입니다. 손상되지 않은 PDF인지, 제목·금액·페이지 수가 맞는지는 PDF를 직접 열어 확인해야 합니다. IncludeDocProperties는 True이므로 실제 배포 파일의 문서 속성에 민감한 정보가 없는지도 별도로 확인하세요.

파일명 날짜와 보고 대상 기간을 따로 확인합니다

파일명의 Format(Now, "yyyymmdd_hhnnss")는 내보내기 실행 시각입니다. 보고 대상 월을 읽어 붙이는 코드가 아닙니다. 예를 들어 9월 보고서를 10월 14일에 다시 내보내면 파일명에는 20261014가 들어가도 내용은 여전히 9월일 수 있습니다. 파일 생성과 페이지 검사가 통과해도 대상 기간·거래처·수신자는 별도로 확인해야 합니다.

  1. 실제 업무에 적용할 때는 Report 제목이나 본문에 승인된 보고 대상 기간과 거래처를 표시하고 미리보기에서 먼저 확인합니다. 이 가상 실습의 입력값·기대값은 그대로 두고, 업무용 사본에 필요한 표시와 검토 항목을 정하세요.
  2. 새로 생성된 PDF의 전체 경로, 보고 대상 기간, 거래처, 확정된 수신자를 배포 확인표에 기록합니다. PDF 뷰어에 열려 있던 이전 파일을 확인하는 대신 이번에 기록한 경로의 파일을 직접 엽니다.
  3. 본문의 제목·금액·페이지 수에 더해 머리글·바닥글의 거래처와 PDF 문서 속성을 확인합니다. IncludeDocProperties:=True이므로 파일 형식을 PDF로 바꾼 것만으로 문서 속성까지 비공개 처리되었다고 보지 않습니다.
  4. 잘림이나 내용 오류를 고쳐 다시 내보냈다면 이전 PDF의 승인 기록을 재사용하지 않습니다. 새 경로의 파일에서 대상 기간·금액·전체 페이지를 다시 확인하고 미완성 파일은 배포 대상에서 계속 제외합니다.

이 글은 Report 한 시트의 PDF 출력을 다룹니다. Excel 수식을 유지해 전달해야 한다면 시트별 XLSX 저장 예제에서 파일 검산과 받는 사람 대조를 확인하세요. 이 버튼에 거래처별 PDF 일괄 생성이나 자동 전송 기능이 있다고 가정하지 않습니다.

PDF 출력 전에 기록하는 순서

  1. practice-84.xlsx를 권한 있는 Windows 로컬 폴더의 ReportDemo.xlsm 사본으로 저장합니다.

  2. Report A1:G40을 인쇄 영역으로 지정하고 미리보기에서 제목·금액·페이지 수를 확인합니다.

  3. ArticleExamples.bas를 가져와 컴파일을 확인하고 양식 컨트롤 버튼에 ExportReportPdf를 연결합니다.

  4. 버튼을 실행하고 새 PDF 경로를 기록합니다. 존재·크기 검사만으로 완료하지 않습니다.

  5. PDF를 직접 열어 월간보고·1200·모든 페이지의 잘림을 확인하고 확인기록 C열에 실제값을 입력합니다.

  6. 오류 시 번호·경로와 남은 파일을 보존하고, 원인을 수정한 별도 사본으로 재실행합니다.

검증 결과와 버튼 연결

Python 검사는 가상 시각의 예상 이름, 이미 존재하는 대상의 중단, 빈 인쇄 영역·저장되지 않은 원본·Mac 조건을 참조 모형에서 확인합니다. 존재하지만 0바이트인 파일도 성공으로 처리하지 않습니다. 0바이트가 아닌 임의 파일은 이 최소 검사만 통과할 수 있다는 반례를 포함해, 이것을 PDF 내용 검증으로 과장하지 않습니다.

Excel 사본에서 컴파일을 확인하고 양식 컨트롤 버튼에 ExportReportPdf를 연결합니다. 첫 실행은 새 PDF 경로를 기록한 뒤 직접 열어 월간보고·1200·전체 페이지를 확인합니다. 확인기록 C열은 아직 실행하지 않은 관찰값이므로 공란입니다.

빈 인쇄 영역·파일명 충돌·0바이트·내용 오류를 나눠 복구하는 PDF 점검 설명 도해
빈 인쇄 영역·파일명 충돌·0바이트·내용 오류를 나눠 복구하는 PDF 점검 설명 도해. 가상 입력과 기대값을 설명한 그림이며 실제 Excel 실행 화면이나 실행 성공 증거가 아닙니다.

실패하면 덮어쓰기 대신 원인을 남깁니다

Report 시트가 없으면 이름을 확인합니다. 인쇄 영역이 비었다는 오류는 Report!A1:G40으로 범위를 다시 지정한 뒤 미리보기를 열어 해결합니다. 권한 오류는 저장 가능한 새 로컬 사본에서 재현합니다. 기존 파일 충돌이면 그 파일을 자동 삭제하지 말고 내용과 소유자를 확인한 뒤 다른 시각의 새 출력으로 작업합니다.

내보내기 도중 실패한 파일이 남아도 자동 삭제하지 않습니다. 오류 번호·경로·크기를 남기고 미완성 파일을 배포 대상에서 분리합니다. 오류를 숨기려 전체 ExportAsFixedFormat을 On Error Resume Next로 감싸지 않습니다. 잘린 표는 미리보기에서 여백·방향·배율을 조정하고 새 PDF와 다시 비교하세요.

이 예제는 한 시트의 통제된 출력 절차입니다. PDF 생성 시간 실측, Office 호환성 조사, 전자서명·접근성·암호화, 다중 작업 동시 저장은 이 실습에서 확인하지 않았습니다.

공식 자료

Worksheet.ExportAsFixedFormat method (Excel)

PageSetup.PrintArea property (Excel)

출처 원문 수집일: S1 2026-09-24; S2 2026-09-24.

작성자 소개