인쇄 페이지 설정 자동화 :: 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 = 원본비율 |