인쇄 페이지 설정 자동화 :: Page_Setup 명령문 (VBA)
| 예제파일 |
요약
Page_Setup 명령문을 작성하여 인쇄 페이지 설정을 자동화 하는 방법을 알아봅니다.
설명
Page_Setup 명령문을 작성하여 인쇄 페이지 설정 자동화를 구현합니다. 인쇄 페이지 설정을 VBA 매크로로 구현하는데에는 2가지 방법이 있습니다.
- 워크시트의 PageSetup 속성을 사용
- 내장함수인 ExecuteExcel4Macro 함수를 사용
시트의 PageSetup 속성을 사용할 경우 명령문 동작속도에 치명적인 영향을 줍니다. 따라서, 본 명령문은 내장함수인 ExecuteExcel4Macro 함수를 사용하여 작성합니다.
다만, ExecuteExcel4Macro는 엑셀 2003 이전 버전에 작성된 함수로, '한 페이지에 모든 행 맞추기' 또는 '한 페이지에 모든 열 맞추기' 기능을 지원하지 않습니다. 따라서 '한 페이지에 모든 열/행 맞추기' 기능은 시트의 PagetSetup 속성으로 설정합니다.
" PAGE.SETUP 설정을 위해 들어가는 인수는 20개며 전체 목록은 포스트 하단에 자세히 적어드렸습니다. "
Page_Setup 명령문과 인쇄 페이지 설정을 사용한 엑셀 PDF 추출 및 이메일 보내기 관련 영상 강의는 아래 링크를 확인하세요.
VBA 전체 명령문
Public Enum ePrintMargin xlNone = 0 xlNarrow = 1 xlNormal = 2 xlWide = 3 End Enum Public Enum ePaperSize xlA4 = 9 xlA3 = 8 xlLetter = 1 xlA5 = 11 End Enum Function getPrintMargin(eValue As ePrintMargin) As Variant '// 설정된 eNum 값으로 페이지 여백설정을 위한 값을 배열로 나열합니다. Select Case eValue Case 0 getPrintMargin = Array(0.05, 0.05, 0.05, 0.05, 0.1, 0.1) Case 1 getPrintMargin = Array(0.25, 0.25, 0.75, 0.75, 0.3, 0.3) Case 2 getPrintMargin = Array(0.7, 0.7, 0.75, 0.75, 0.3, 0.3) Case 3 getPrintMargin = Array(1, 1, 1, 1, 0.5, 0.5) End Select End Function Sub Page_Setup(ws As Worksheet, Optional LHead As String = "", Optional RHead As String = "&D / &T", _ Optional LFoot As String = "본 페이지의 무단복제를 금합니다.", Optional RFoot As String = "&P / &N 페이지", _ Optional eMargin As ePrintMargin = xlNarrow, _ Optional HFit As Boolean = True, Optional VFit As Boolean = False, _ Optional HCenter As Boolean = True, Optional VCenter As Boolean = False, _ Optional eOrient As XlPageOrientation = xlPortrait, Optional eSize As ePaperSize = xlA4) Dim pSetup As String Dim varMargin As Variant Dim lngOrient As Integer '// 인쇄설정 업데이트 중단 (속도증가) Application.PrintCommunication = False '// 인쇄여백값을 받아옵니다. varMargin = getPrintMargin(eMargin) '// 인쇄용지 방향을 설정합니다. If eOrient = xlPortrait Then lngOrient = 1 Else lngOrient = 2 End If '// ExecuteExcel4Macro 의 Page.Setup 명령문 실행을 위한 문구를 입력합니다. Head = """&L" & LHead & "&R" & RHead & """" '// 페이지 머릿말입니다. Foot = """&L" & LFoot & "&R" & RFoot & """" '// 페이지 꼬릿말입니다. pLeft = varMargin(0) '// 왼쪽여백 pRight = varMargin(1) '// 오른쪽여백 Top = varMargin(2) '// 윗여백 Bot = varMargin(3) '// 아래여백 Head_margin = varMargin(4) '// 머릿말여백 Foot_margin = varMargin(5) '// 꼬릿말여백 Hdng = 0 '// 행/열반복 출력여부 0 = 반복출력안함 1 = 반복출력 Grid = False '// 눈금선출력여부 Notes = False '// 메모출력여부 H_cntr = HCenter '// 가운데정렬 V_cntr = VCenter '// 중앙정렬 Orient = lngOrient '// 문서방향, 1 = 세로 2 = 가로 Paper_size = eSize '// 용지크기 Pg_num = 1 '// 페이지 시작번호 Pg_order = 1 '// 페이지번호 순서, 1 = 위-아래-우 2 = 좌-우-아래 Quality = "" '// 인쇄품질 (dot-per-inch로 입력) (공백 = 자동) bw_cells = False '// 흑백인쇄여부, TRUE = 글자/테두리 검정,배경 흰색 FALSE = 색깔 pScale = 100 '// 축소/확대비율 또는 TRUE (Fit to Page) '// 여백을 없음으로 설정할 경우 머릿말/꼬릿말을 삭제하여 인쇄영역과 겹치지 않도록 합니다. If eMargin = xlNone Then Head = """""" Foot = """""" End If '// ExecuteExcel4Macro 명령문을 실행합니다. pSetup = "PAGE.SETUP(" & Head & ", " & Foot & ", " & pLeft & ", " & pRight & ", " & Top & ", " & Bot & ", " pSetup = pSetup & Hdng & ", " & Grid & "," & H_cntr & "," & V_cntr & "," & Orient & "," pSetup = pSetup & Paper_size & "," & pScale & "," pSetup = pSetup & Pg_num & "," & Pg_order & "," & bw_cells & "," & Quality & "," pSetup = pSetup & Head_margin & "," & Foot_margin & "," & Notes & ")" Application.ExecuteExcel4Macro pSetup '// ExecuteExcel4Macro에서는 '한 페이지에 행/열 맞추기' 기능이 지원되지 않습니다. '// 따라서 시트의 PageSetup 속성으로 '페이지 행/열 맞추기 기능을 설정합니다. With ws.PageSetup If HFit = True Then .FitToPagesWide = 1 Else .FitToPagesWide = False End If If VFit = True Then .FitToPagesTall = 1 Else .FitToPagesTall = False End If End With '// 인쇄설정 업데이트 Application.PrintCommunication = True End Sub
명령문에 사용된 인수
| 인수 | 설명 | 기본값 |
| ws [WorkSheet] |
페이지 레이아웃 설정을 변경할 시트입니다. | |
| LHead [String] |
좌측에 들어갈 머릿말입니다. | |
| RHead [String] |
우측에 들어갈 머릿말입니다. | 일자 / 시간 |
| LFoot [String] |
좌측에 들어갈 꼬릿말입니다. | 본 페이지의 무단 복제를 금합니다. |
| RFoot [String] |
우측에 들어갈 꼬릿말입니다. | 1 / N 페이지 |
| eMargin [ePrintMargin] |
용지 여백을 결정합니다. | 좁은여백 |
| HFit [Boolean] |
한 페이지 모든 행 맞춤 설정 여부 | TRUE |
| VFit [Boolean] |
한 페이지 모든 열 맞춤 설정 여부 | FALSE |
| HCenter [Boolean] |
가운데 정렬 여부 | TRUE |
| VCenter [Boolean] |
중앙 정렬 여부 | FALSE |
| eOrient [xlPageOrientation] |
용지방향 | 세로방향 |
| eSize [ePaperSize] |
용지크기 | A4 |
세부내용
1. Enum을 통해 새로운 2개의 데이터타입을 생성합니다.
- ePrintMargin : getPrintMargin 함수에서 인쇄 여백을 설정하기위한 데이터타입입니다.
- ePaperSize : ExcelExecute4Marco 페이지설정 명령문에서 용지크기 설정을 위한 데이터타입
Public Enum ePrintMargin xlNone = 0 xlNarrow = 1 xlNormal = 2 xlWide = 3 End Enum Public Enum ePaperSize xlA4 = 9 xlA3 = 8 xlLetter = 1 xlA5 = 11 End Enum
2. GetPrintMargin 명령문을 작성합니다.
- GetPrintMargin 함수 : 사용자가 용지여백 종류를 선택하면, 여백 종류에 따른 값 수치를 배열로 반환하는 함수입니다.
- GetPrintMargin 함수는 Page_Setup 함수의 보조함수로 사용됩니다.
- 각 배열에 들어간 값은 ("왼쪽", "오른쪽", "위쪽", "아래쪽", "머릿말", "꼬릿말") 의 여백입니다.
Function getPrintMargin(eValue As ePrintMargin) As Variant '// 설정된 eNum 값으로 페이지 여백설정을 위한 값을 배열로 나열합니다. Select Case eValue Case 0 getPrintMargin = Array(0.05, 0.05, 0.05, 0.05, 0.1, 0.1) Case 1 getPrintMargin = Array(0.25, 0.25, 0.75, 0.75, 0.3, 0.3) Case 2 getPrintMargin = Array(0.7, 0.7, 0.75, 0.75, 0.3, 0.3) Case 3 getPrintMargin = Array(1, 1, 1, 1, 0.5, 0.5) End Select End Function
3. Page_Setup 명령문을 작성합니다.
본 명령문에서는 주로 사용되는 페이지 레이아웃 설정만 명령문의 인수로 입력하였으며, 필요에 따라 원하는 인수를 추가해서 사용할 수 있습니다.
사용된 변수는 아래와 같습니다.
- pSetup : ExcelExecute4Macro - Page.Setup 함수를 실행할 전제 명령문입니다. Page.Setup 명령문에 들어가는 인수의 종류 및 순서는 본 포스트 아래부분에 적어드린 인수목록을 참고하세요.
- varMargin : GetPrintMargin 함수로 받아올 용지여백 값입니다. 예를들어 사용자가 xlNarrow (좁은여백) 을 선택할경우, (0.25, 0.25, 0.75, 0.75, 0.3, 0.3) 0.25, 0.25, 0.75, 0.75, 0.3, 0.3) 여백값을 반환합니다.
- lngOrient : 용지 방향을 결정합니다. 세로방향일경우 1, 가로방향일경우 2를 반환합니다.
명령문의 빠른 동작을 위해 PrintCommunication 속성을 각 명령문의 시작과 끝부분에 넣어 변경합니다.
Application.PrintCommunication = False '//페이지 레이아웃 설정 명령문... Application.PrintCommunication = True
사용자가 용지여백을 '없음'으로 설정했을시, 머릿말과 꼬릿말이 있다면 출력부분과 내용이 겹치게 됩니다. 따라서 용지여백이 '없음'일 경우 머릿말과 꼬릿말을 공백으로 바꿔줍니다.
'// 여백을 없음으로 설정할 경우 머릿말/꼬릿말을 삭제하여 인쇄영역과 겹치지 않도록 합니다. If eMargin = xlNone Then Head = """""" Foot = """""" End If
ExecuteExcel4Macro의 Page.Setup 함수에서는 '한 페이지 모든 행 맞추기' 설정을 할 수 없습니다. 따라서 '한 페이지 모든 행/열 맞추기' 설정이 필요할 경우 워크시트의 PageSetup 속성을 변경합니다. (PageSetup 속성을 많이 변경할 경우 명령문 동작 속도에 큰 영향이 있으므로 사용에 주의합니다.)
'// ExecuteExcel4Macro에서는 페이지 가로/세로 페이지 맞춤이 지원 안됩니다. '// 시트의 PageSetup 속성으로 가로/세로맞춤을 설정합니다. With ws.PageSetup If HFit = True Then .FitToPagesWide = 1 Else .FitToPagesWide = False End If If VFit = True Then .FitToPagesTall = 1 Else .FitToPagesTall = False End If End With
Page_Setup 명령문을 완성합니다.
Sub Page_Setup(ws As Worksheet, Optional LHead As String = "", Optional RHead As String = "&D / &T", _ Optional LFoot As String = "본 페이지의 무단복제를 금합니다.", Optional RFoot As String = "&P / &N 페이지", _ Optional eMargin As ePrintMargin = xlNarrow, _ Optional HFit As Boolean = True, Optional VFit As Boolean = False, _ Optional HCenter As Boolean = True, Optional VCenter As Boolean = False, _ Optional eOrient As XlPageOrientation = xlPortrait, Optional eSize As ePaperSize = xlA4) Dim pSetup As String Dim varMargin As Variant Dim lngOrient As Integer '// 인쇄설정 업데이트 중단 (속도증가) Application.PrintCommunication = False '// 인쇄여백값을 받아옵니다. varMargin = getPrintMargin(eMargin) '// 인쇄용지 방향을 설정합니다. If eOrient = xlPortrait Then lngOrient = 1 Else lngOrient = 2 End If '// ExecuteExcel4Macro 의 Page.Setup 명령문 실행을 위한 문구를 입력합니다. Head = """&L" & LHead & "&R" & RHead & """" '// 페이지 머릿말입니다. Foot = """&L" & LFoot & "&R" & RFoot & """" '// 페이지 꼬릿말입니다. pLeft = varMargin(0) '// 왼쪽여백 pRight = varMargin(1) '// 오른쪽여백 Top = varMargin(2) '// 윗여백 Bot = varMargin(3) '// 아래여백 Head_margin = varMargin(4) '// 머릿말여백 Foot_margin = varMargin(5) '// 꼬릿말여백 Hdng = 0 '// 행/열반복 출력여부 0 = 반복출력안함 1 = 반복출력 Grid = False '// 눈금선출력여부 Notes = False '// 메모출력여부 H_cntr = HCenter '// 가운데정렬 V_cntr = VCenter '// 중앙정렬 Orient = lngOrient '// 문서방향, 1 = 세로 2 = 가로 Paper_size = eSize '// 용지크기 Pg_num = 1 '// 페이지 시작번호 Pg_order = 1 '// 페이지번호 순서, 1 = 위-아래-우 2 = 좌-우-아래 Quality = "" '// 인쇄품질 (dot-per-inch로 입력) (공백 = 자동) bw_cells = False '// 흑백인쇄여부, TRUE = 글자/테두리 검정,배경 흰색 FALSE = 색깔 pScale = 100 '// 축소/확대비율 또는 TRUE (Fit to Page) '// 여백을 없음으로 설정할 경우 머릿말/꼬릿말을 삭제하여 인쇄영역과 겹치지 않도록 합니다. If eMargin = xlNone Then Head = """""" Foot = """""" End If '// ExecuteExcel4Macro 명령문을 실행합니다. pSetup = "PAGE.SETUP(" & Head & ", " & Foot & ", " & pLeft & ", " & pRight & ", " & Top & ", " & Bot & ", " pSetup = pSetup & Hdng & ", " & Grid & "," & H_cntr & "," & V_cntr & "," & Orient & "," pSetup = pSetup & Paper_size & "," & pScale & "," pSetup = pSetup & Pg_num & "," & Pg_order & "," & bw_cells & "," & Quality & "," pSetup = pSetup & Head_margin & "," & Foot_margin & "," & Notes & ")" Application.ExecuteExcel4Macro pSetup '// ExecuteExcel4Macro에서는 한 페이지 모든 행 맞추기 기능이 지원되지 않습니다. '// 따라서 필요시 시트의 PageSetup 속성으로 한 페이지 모든 행 맞추기를 설정합니다. With ws.PageSetup If HFit = True Then .FitToPagesWide = 1 Else .FitToPagesWide = False End If If VFit = True Then .FitToPagesTall = 1 Else .FitToPagesTall = False End If End With '// 인쇄설정 업데이트 활성화 Application.PrintCommunication = True End Sub
ExecuteExcel4Macro 함수 PAGE.SETUP 인수 목록
- 아래 인수들은 반드시 순서에 맞춰서 입력되어야 합니다.
- 인수가 누락되거나 옳지 않은 값이 입력될경우 ExecuteExcel4Macro 명령문은 런타임오류(1004) 를 반환합니다.
| 인수 | 설명 |
| Head | 페이지 머릿말입니다. LHead는 좌측, RHead는 우측에 입력됩니다. |
| Foot | 페이지 꼬릿말입니다. LFoot은 좌측, RFoot은 우측에 입력됩니다. |
| pLeft | 좌측여백입니다. GetPrintMargin 함수에서 받아옵니다. |
| pRight | 우측여백입니다. GetPrintMargin 함수에서 받아옵니다. |
| Top | 상단여백입니다. GetPrintMargin 함수에서 받아옵니다. |
| Bot | 하단여백입니다. GetPrintMargin 함수에서 받아옵니다. |
| Head_Margin | 머릿말 여백입니다. GetPrintMargin 함수에서 받아옵니다. |
| Foot_Margin | 꼬릿말 여백입니다. GetPrintMargin 함수에서 받아옵니다. |
| Hdng | 특정 행/열을 반복출력할 여부를 결정합니다. 0 = 반복출력안함 1 = 반복출력 |
| Grid | 눈금선 출력여부를 결정합니다. True = 눈금선 출력 False = 눈금선 출력 안함 |
| Notes | 메모 출력여부를 결정합니다. True = 메모 출력 False = 메모 출력 안함 |
| H_Cntr | 용지 가운데 정렬 여부를 결정합니다. True = 가운데 정렬 False = 좌측정렬 |
| V_Cntr | 용지 중앙 정렬 여부를 결정합니다. True = 중앙정렬 False = 위쪽정렬 |
| Orient | 용지출력방향을 결정합니다. 1 = 세로방향 2 = 가로방향 |
| Paper_Size | 용지크기를 결정합니다. 1 = 편지용지 2 = 편지용지 (소) 8 = A3 9 = A4 10 = A4 (소) 11 = A5 12 = B4 13 = B5 16 = 10x14 17 = 11x17 18 = 노트 |
| Pg_Num | 페이지 시작번호를 결정합니다. |
| Pg_Order | 페이지번호 매김방향을 결정합니다. 1 = 위-아래-우측 방향 2 = 좌-우-아래 방향 |
| Quality | 인쇄 품질을 결정합니다. (Dot-Per-Inch 값으로 입력) 공백 = 자동설정 값 = Dot-Per-Inch 값에 따라 적용 |
| bw_cells | 흑백 인쇄여부를 결정합니다. True = 흑백인쇄 False = 칼라인쇄 |
| pScale | 축소/확대비율을 결정합니다. (% 값으로 입력합니다) TRUE = 한 페이지 모든 행/열 맞춤 100 = 원본비율 |


위 수업 관련해서 질문 드립니다 ^^
추출된 PDF를 바탕화면이 아닌 특정폴더 (예를 들어 C:\ '저장폴더' 폴더) 에 저장하는 경우는 어떻게 코드를 바꿔야 할까요?
다른분의 커뮤니티 질문에 오빠두님이 답변 주신것 보고,
If SavePath="" Then SavePath= GetDesktopPath 를
If SavePath="" Then SavePath="C:\Users..\Desktop\저장폴더" 로 변경해서 적용했는데 다른 질문자님처럼 저도 제가 지정한 폴더명이 새로 생성된 파일이름앞에 붙고(예: 저장폴더_오빠두 2019년 8월 급여명세서)
새로 생성된 파일은 기존처럼 바탕화면에 저장됩니다.
혹시 SubModule에서 GetDesktopPath /function을 수정해야 할까요?
혹여 다른 방법이 있다면 조언 부탁드립니다 :)
를 아래와 같이 변경해보시겠어요? 폴더경로 뒤에 "\" 를 추가해보시기 바랍니다.^^
답변이 도움이 되셨길 바랍니다.
감사합니다.
그만큼 유익한 강의가 많다는 것이겠죠!!
한가지 질문이 있는데요...
인쇄 옵션중에 <선택영역 인쇄 - 한페이지에 시트 맞추기> 가 있는데,
한페이지에 시트 맞추기를 하려면 어떻게 해야 하는 것인가요?
HFit, VFit 둘 다 True로 했더니 페이지가 이상해지더라구요....
조언 부탁드립니다
한페이지에 시트 맞추기 = 행 또는 열로 페이지 맞춤과 동일합니다.
세로로 긴 문서를 가로용지에 인쇄해야 할 경우 VFit을 True로 설정,
가로로 긴 문서를 세로용지에 인쇄해야 할 경우 HFit 을 True로 설정하시면 됩니다.
본 명령문에서 사용한 ExecuteExcel4Macro 함수는 한페이지에시트맞추기 기능을 따로 지원하지 않습니다.:)
답변이 도움이 되셨길 바랍니다.
페이지 넘버라던지 포함이 되면 안되는데 ..
일부 사내 보안 프로그램 등으로 출력물에 머릿말/꼬릿말이 자동으로 설정될 경우 그럴 수 있습니다.
엑셀의 머릿말/꼬릿말 설정에서 머릿말/꼬릿말을 지운 뒤 인쇄를 했을 때, 머릿말/꼬릿말이 자동으로 설정된다면 외부 프로그램으로 인한 문제이므로 VBA로는 해결이 불가능합니다.
답변이 도움이 되셨길 바랍니다.
질문^^
만약 2페이지 문서인데 1페이지 또는 2페이지만 PDF저장 하려면 .. 어떻게 해야 할까요?
어떤 명령문을 사용하냐에 따라 다릅니다.^^
PrintOut 함수로 인쇄할 경우 Pages 인수를 변경해보세요.
또는 직접 범위를 지정해서 인쇄하는 방법도 있습니다. 아래 영상강의를 참고해보세요.
https://www.oppadu.com/%ec%97%91%ec%85%80-pdf-%ec%9e%90%eb%8f%99-%ec%a0%80%ec%9e%a5-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8/
매크로를 사용하면 가능합니다. WorkBook_Open 이벤트로 확대/축소비율을 지정해주세요.
매크로를 사용하지 않을 경우, 최종 저장하기 전 원하시는 배율을 맞춘 후 저장해주시면 됩니다 ^^
Notes = True는 메모를 넣는 설정이고 메모를 표시하는 것과는 별개입니다.
메모 표시 설정은
PrintErrors = xlPrintErrorsDisplayed
로 PageSetup 속성을 바꿔서 사용하면 됩니다.
관련 설명은 아래 링크를 확인해보세요.
https://docs.microsoft.com/en-us/office/vba/api/excel.pagesetup.printerrors
머릿글/꼬릿글 설정은 아래 링크를 참고해보세요..
https://stackoverflow.com/questions/67238826/excel-vba-change-footer-font-and-font-size
ActiveSheet.PageSetup.LeftFooter = "&""Arial""&10" & Range("$G$4").Value
PDF 저장폴더 관련하여, 해당 폴더에 저장하고 싶습니다.
예를 들면, 수많은 폴더가 있습니다.
'A업체 폴더' 에서 엑셀 파일을 실행한 의 경우, 제가 별도로 폴더저장 경로를 지정하지 않더라도, 자동으로 'A업체 폴더' 해당폴더의 경로에 지정되었으면 좋겠습니다.
'B업체 폴더' 에서 실행한 엑셀 파일은 'B업체 폴더' 에 저장되었으면 좋겠습니다.
VBA상에서 직접 주소를 입력하는것이 아닌, 실행한 엑셀파일의 폴더로 저장이 되었으면 좋겠습니다.
마치 매크로 없이, PDF 를 인쇄를 실행하면, 폴더 지정을 하지 않더라도, 해당폴더에 저장되듯이 자동으로 해당폴더에 지정되면 좋겠습니다.
엑셀VBA에 이런 기능도 있을까요?
선택한 파일의 상위경로를 받아서 저장 경로로 설정하도록 코드를 작성해보세요.
https://stackoverflow.com/questions/418622/find-the-directory-part-minus-the-filename-of-a-full-path-in-access-97