Worksheet 개체

각 시트를 개별 PDF로 저장

노만e 2025. 3. 19. 07:32

회사에서 월간보고서 작성시 사용하는 VBA 코드 입니다.

1️⃣ 주요 기능과 필요성

✅ (1) 엑셀 시트를 개별 PDF 파일로 자동 저장

  • 엑셀 내 여러 개의 시트를 하나씩 PDF로 변환하는 반복적인 작업을 자동화.
  • 각 시트를 별도의 PDF 파일로 저장하여 공유 및 보관이 용이.
  • 보고서, 회의 자료, 데이터 분석 결과 등을 각각의 파일로 저장할 때 매우 유용.

🔹 💡 기존 방법 vs. 매크로 실행 후 비교

방법
작업 방식
소요 시간
수동 저장
각 시트를 선택 → 파일 → 내보내기 → PDF 저장을 반복
⏳ 오래 걸림

✅ (2) 사용자가 직접 저장할 폴더를 선택할 수 있음

  • Application.FileDialog(msoFileDialogFolderPicker)을 사용하여 사용자가 PDF 저장 위치를 선택 가능.
  • 원하는 폴더에 저장할 수 있어 파일 정리 및 관리가 편리.

✅ (3) 파일 이름 자동 지정 및 폴더 생성

  • 저장될 PDF 파일 이름을 엑셀 시트 이름으로 자동 설정.
  • 엑셀 파일 이름을 기반으로 새 폴더를 자동 생성하여 파일을 정리.
  • 폴더 구조 예시
📂 선택한 폴더
└ 📂 엑셀 파일명 (워크북명)
├ 📄 Sheet1.pdf
├ 📄 Sheet2.pdf
├ 📄 Sheet3.pdf

📌 수동으로 폴더를 만들고 파일 이름을 지정할 필요 없이 자동화.


✅ (4) 기존 PDF 파일이 있을 경우 덮어쓰기 여부 선택

  • 기존에 같은 이름의 PDF 파일이 있을 경우 사용자가 덮어쓸지 선택 가능.
  • MsgBox를 통해 중복 파일로 인한 실수 방지.
  • 데이터가 변경될 경우 기존 파일을 유지하거나 업데이트할 수 있어 안전한 문서 관리 가능.

✅ (5) 성능 최적화 및 빠른 실행

  • Application.ScreenUpdating = False 및 Application.Calculation = xlCalculationManual 사용하여 엑셀 속도 저하 방지.
  • MkDir를 활용해 폴더가 자동 생성되므로 사용자가 일일이 폴더를 만들 필요 없음.
  • For 루프를 사용하여 각 시트를 자동으로 반복 처리수십 개의 시트도 몇 초 내 변환 가능.
Sub ExportEachSheetAsPDF(control As IRibbonControl)
    Dim sheetIndex As Long
    Dim saveFolder As String, workbookName As String
    Dim pdfFilePath As String, sheetFolder As String
    Dim selectedSheet As Worksheet
    
    ' 성능 최적화를 위해 화면 업데이트 비활성화
    Application.ScreenUpdating = False
    On Error Resume Next ' 오류 무시 (예: 폴더 중복 생성 오류 방지)

    ' 사용자에게 PDF 저장 폴더 선택 요청
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .Title = "PDF를 저장할 폴더를 선택하세요"
        .Show
        ' 사용자가 폴더를 선택하지 않으면 종료
        If .SelectedItems.Count = 0 Then Exit Sub
        saveFolder = .SelectedItems(1) & "\"
    End With

    ' 현재 워크북 이름에서 확장자 제거 (폴더 이름으로 사용)
    workbookName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)
    
    ' 워크북별 PDF 저장 폴더 생성
    MkDir saveFolder & workbookName
    sheetFolder = saveFolder & workbookName & "\"

    ' 각 시트를 PDF로 저장
    For sheetIndex = 1 To ActiveWorkbook.Sheets.Count
        Set selectedSheet = ActiveWorkbook.Sheets(sheetIndex)
        pdfFilePath = sheetFolder & Trim(selectedSheet.Name) & ".pdf"
        
        ' 동일한 파일이 존재할 경우 덮어쓰기 확인
        If Dir(pdfFilePath) <> "" Then
            If MsgBox("동일한 파일이 존재합니다. 덮어쓸까요?" & vbCrLf & pdfFilePath, _
                      vbYesNo + vbExclamation, "파일 덮어쓰기 확인") = vbNo Then
                Exit Sub
            End If
        End If
        
        ' 시트를 PDF로 저장
        selectedSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            fileName:=pdfFilePath, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    Next sheetIndex

    ' 완료 메시지 출력
    MsgBox "모든 시트를 각각의 PDF로 저장하였습니다.", vbInformation, "PDF 저장 완료"

    ' 오류 처리 해제 및 화면 업데이트 재활성화
    On Error GoTo 0
    Application.ScreenUpdating = True
End Sub

ExportEachSheetAsPDF.xlsx
0.02MB