회사에서 월간보고서 작성시 사용하는 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 |