엑셀 Page_Setup 모듈 사용법 및 전체 명령문 :: 페이지 레이아웃 설정

지정한 시트의 머릿글, 여백 등의 인쇄영역을 설정하는 Page_Setup 모듈의 사용법 및 전체 명령문 동작원리를 알아봅니다.

홈페이지 » 엑셀 Page_Setup 모듈 사용법 :: 페이지 레이아웃 설정

인쇄 페이지 설정 자동화 :: 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

명령문에 사용된 인수

인수데이터타입설명기본값
wsWorkSheet페이지 레이아웃 설정을 변경할 시트입니다.
LHeadString좌측에 들어갈 머릿말입니다.
RHeadString우측에 들어갈 머릿말입니다.일자 / 시간
LFootString좌측에 들어갈 꼬릿말입니다.본 페이지의 무단 복제를 금합니다.
RFootString우측에 들어갈 꼬릿말입니다.1 / N 페이지
eMarginePrintMargin용지 여백을 결정합니다.좁은여백
HFitBoolean한 페이지 모든 행 맞춤 설정 여부True
VFitBoolean한 페이지 모든 열 맞춤 설정 여부False
HCenterBoolean가운데 정렬 여부True
VCenterBoolean중앙 정렬 여부False
eOrientxlPageOrientation용지방향세로방향
eSizeePaperSize용지크기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 = 원본비율

관련 기초함수 설명 | by 오빠두엑셀

글을 발견하지 못했습니다.

관련공식 포스트 | by 오빠두엑셀

글을 발견하지 못했습니다.
5 3 votes
게시글평점
현재 페이지 댓글알림 신청
알림 설정
guest
6 Comments
Inline Feedbacks
View all comments
Young
Young
2020년 4월 21일 7:22 오전
게시글평점 :
     

안녕하세요! 항상 좋은 수업 넘 감사드립니다.  🙂 위 수업 관련해서 질문 드립니다 ^^ 추출된 PDF를 바탕화면이 아닌 특정폴더 (예를 들어 C:\ '저장폴더' 폴더) 에 저장하는 경우는 어떻게 코드를 바꿔야 할까요?… 더보기 »

Young
Young
2020년 4월 21일 9:39 오후

간단한 거지만 엄청 중요한거였네요! 앞으로도 잘 써먹을수 있도록 해볼게요. 감사합니다! 🙂

그리고
그리고
2020년 4월 30일 9:48 오전
게시글평점 :
     

vba 어렵고도 재미있네요 좋은 강의 감사합니다.

초보두
초보두
2020년 8월 3일 2:42 오후
게시글평점 :
     

안녕하세요! 엑셀관련해서 모르는 것이있으면 오빠두를 찾게 되네요.. 그만큼 유익한 강의가 많다는 것이겠죠!! 한가지 질문이 있는데요... 인쇄 옵션중에 <선택영역 인쇄 - 한페이지에 시트 맞추기> 가 있는데, 한페이지에 시트 맞추기를 하려면 어떻게… 더보기 »

6
0
여러분의 생각을 댓글로 남겨주세요.x