• 최초 작성일: 2001-02-15
  • 최종 수정일: 2026-09-30
  • 조회수: 8 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 홀수/짝수 페이지 인쇄하기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

컴퓨터 전문잡지 PC사랑 3월호에 Exceller의 강좌가 실립니다.

EXCEL을 두 시간만 써 본 사람이면 누구나 이해하실 수 있는 내용들로써 가계부, 성적표, 영업실적 보고서 등 다섯 가지 테마를 선정하여 Step By Step으로 작성하는 내용으로 꾸며지게 됩니다. 관심이 있는 분들은 참고하시기 바랍니다.

VB0090 강좌에서 역순으로 인쇄하는 방법에 대해 소개해 드렸습니다. Exceller's Home에 자주 들러서 질문도 하고, 열심히 모니터링을 해 주시는

Q&A 게시판에 이런 질문이 올라왔습니다.

안녕하세요 날씨가 갑자기 춥네요.
다름이 아니오라 90번 강의에서요, 지난번에 문의를 드렸는데 황선생님이
답변을 주셨는데요,
엑셀러님의 강의내용을 약간 수정해서 유저폼에다가
opt홀수, opt짝수 버튼을 붙이고
Sub GeneralOrderPrint(ByVal OK As Boolean)
Dim intTotalPage As Integer
Dim I As Integer

intTotalPage=ExecuteExcel4Macro("get.document(50)")

For I=1 To intTotalPage
Select Case True
Case Opt홀수
I=2 Mod 1
ActiveSheet.PrintOut from:=I, To:=I, preview:=OK
Case Opt짝수
I=2 mod 0
ActiveSheet.PrintOut from:=I, To:=I, preview:=OK
End Select
Next I
End Sub

했는데 될 줄 알았는데 역시 안되네요.

컴파일 오류 변수정의가 안됨.
이런 메시지가 나오는데요 손좀 봐 주세요.

요약하자면, 역순인쇄 방법에 더하여 홀수 또는 짝수면만 인쇄할 수 있도록 하는 기능을 추가하고 싶다는 질문이시군요. 일단 버튼을 눌러 실행시켜 보세요.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

홀수/짝수 페이지 인쇄하기

핵심 요약: 홀수/짝수 페이지 인쇄

체크박스 상태에 따라 1(홀수), 2(짝수), 3(전체)을 프로시저에 넘기고, 순환문의 시작값과 Step을 바꿔 원하는 페이지만 인쇄합니다.

  • 1단계: 폼의 체크박스를 확인해 bytPage 변수에 1, 2, 3을 지정합니다.
  • 2단계: Optional 인수로 값을 받아 홀수면 또는 짝수면 인쇄 여부를 분기합니다.
  • 3단계: 역순 인쇄는 마지막 페이지부터 마이너스 Step으로 순환합니다.

Step 1: 실행 방법과 폼 만들기

지난 강좌와 마찬가지로 "미리보기" 항목을 클릭하면 매번 "닫기" 버튼을 눌러야 하기 때문에 번거롭다고 생각하는 분이 있으실 지 모르겠습니다만 이것은 여러분들에게 보여드리기 위한 것이고, 실제 출력을 하실 때는 "프린터로…" 항목을 누르시면 됩니다.

(1) VB Editor 상태에서 UserForm을 하나 삽입하고 아래와 같이 컨트롤들을 그려 넣습니다.

홀수/짝수 페이지 인쇄 사용자 정의 폼: 정상 인쇄와 역순 인쇄의 프린터로, 미리보기 옵션 버튼과 홀수면만 인쇄, 짝수면만 인쇄 체크박스
아이엑셀러

Step 2: 정상 인쇄 - 미리보기 버튼 코드

(2) "정상 인쇄" 부분에 있는 "미리보기" 옵션 버튼을 더블클릭하고 아래와 같은 코드를 작성합니다.

지난 시간의 코드는 Unload Me 다음에 GeneralOrderPrint True만 호출하는 형태였습니다.

Private Sub optNormalPreview_Click()
    Dim bytPage As Byte
    '//홀수면을 인쇄할 것인지 아니면 짝수면을
    '//인쇄할 것인지에 대한 선택을 받기 위한
    '//변수를 선언해 주었습니다. Byte 변수는
    '//여러 변수타입 중에서 크기가 가장 작은
    '//것입니다.

    If chkOdd Then
        bytPage = 1
    ElseIf chkEven Then
        bytPage = 2
    Else
        bytPage = 3
    End If
    '//홀수면 인쇄 체크박스가 선택되었으면 bytPage 변수에 1을, 짝수면 인쇄이면 2를,
    '//그 이외의 경우라면 3을 Assign, 즉 대입시킵니다.

    Unload Me
    GeneralOrderPrint True, bytPage
    '//이 부분이 중요합니다! 지난 시간에는 정상순서 인쇄인가 아니면 역순 인쇄인가만을
    '//선택받아서 처리를 하면 되었으나 여기에다가 한 가지 조건 분기가 더 필요하므로
    '//그 처리를 위한 변수를 하나 더 사용하였습니다.

End Sub

Step 3: 정상 인쇄 - 프린터로 버튼 코드

(3) Shift + <F7>키를 눌러 UserForm을 다시 호출한 다음, "정상 인쇄" 프레임 내의 "프린터로…" 항목을 더블클릭하고 필요한 코드를 입력합니다.

Private Sub optNormalPrinting_Click()
    Dim bytPage As Byte

    If chkOdd Then
        bytPage = 1
    ElseIf chkEven Then
        bytPage = 2
    Else
        bytPage = 3
    End If
    Unload Me
    GeneralOrderPrint False, bytPage
    '//다른 것은 위의 (2)와 똑같은데 False 값을 건네준다는 점이 다릅니다.

End Sub

Step 4: GeneralOrderPrint 프로시저

(4) 모듈시트를 한장 삽입합니다. GeneralOrderPrint 프로시저는 일반 모듈시트에 작성을 합니다.

Sub GeneralOrderPrint(ByVal OK As Boolean, _
    Optional ByVal EvenOrOdd As Byte)
    '//프로시저를 시작할 때부터 예사롭지 않게 시작하였지요? ^^ 이벤트 핸들러 프로시저에서
    '//두 개의 변수를 건네받았으니 매개변수도 두 개를 사용하여야 하기 위한 것입니다.
    '//여기서 Optional이라는 것은 선택적 변수라는 것으로, 이것은 사용을 할 수도, 하지 않을
    '//수도 있다는 것입니다. 즉 필수사양이 아니라 옵션사양이라는 의미입니다.

    Dim intTotalPage As Integer
    Dim i As Integer
    intTotalPage = ExecuteExcel4Macro("get.document(50)")

    If EvenOrOdd = 1 Then
        For i = 1 To intTotalPage Step 2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    ElseIf EvenOrOdd = 2 Then
        For i = 2 To intTotalPage Step 2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    Else
        For i = 1 To intTotalPage
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    End If
    '//코드를 잔뜩 길게 써 놓았지만 개념 자체는 아주 간단합니다. EvenOrOdd라는 변수는
    '//Optional 변수, 즉 선택적 변수로서 사용자가 짝수 인쇄 항목을 눌렀는지 아니면 반대의
    '//것을 눌렀는지에 대한 정보를 담고 있습니다. 그래서 이것을 조건분기문을 사용하여
    '//각 상황에 맞는 처리를 해 주면 되는 것이지요. EvenOrOdd 변수에 1이라는 값이 담겨져
    '//있으면 홀수인쇄, 2가 담겨져 있으면 짝수인쇄, 이도저도 아니면 모든 페이지를 인쇄하게
    '//되는 것입니다.

    '//나머지 사항에 대해서는 지난 강좌에서 설명을 드렸으므로 생략!

End Sub

Step 5: 역순 인쇄 - ReverseOrderPrint 프로시저

이상의 것이 정상인쇄 및 그에 따른 홀수면/짝수면 인쇄와 관련된 것입니다. 역순으로 인쇄하는 것은 이것과 대동소이 하지요? 즉, 다른 것은 거의 비슷한데 For ~ Next 순환문을 돌 때 맨 나중의 것부터 시작해서 마이너스 Step으로 순환한다는 것이 다를 뿐이지요.

Sub ReverseOrderPrint(ByVal OK As Boolean, _
    Optional ByVal EvenOrOdd As Byte)
    Dim intTotalPage As Integer
    Dim i As Integer
    intTotalPage = ExecuteExcel4Macro("get.document(50)")

    If EvenOrOdd = 1 Then
        For i = intTotalPage - ((intTotalPage + 1) Mod 2) To 1 Step -2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    ElseIf EvenOrOdd = 2 Then
        For i = intTotalPage - (intTotalPage Mod 2) To 2 Step -2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    Else
        For i = intTotalPage To 1 Step -1
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    End If
    '//홀수면은 가장 큰 홀수 페이지부터, 짝수면은 가장 큰 짝수 페이지부터 시작하도록
    '//시작값을 정해 주는 부분이 정상 인쇄와 다릅니다.
End Sub

위에서 굵게 표시한 부분이 아마 다를 것입니다. 왜 이렇게 해 주었는지 곰곰이 생각해 보도록 하세요. 물론 이런 방법이 아닌 다른 방법도 있을 것입니다.

마무리

오늘은 여기까지…

정리 — 홀짝 인쇄 핵심

구분 사용한 코드 역할
전체 페이지 수 ExecuteExcel4Macro("get.document(50)") 시트의 총 페이지 수
홀수면 인쇄 For i = 1 To 전체 Step 2 1, 3, 5… 페이지
짝수면 인쇄 For i = 2 To 전체 Step 2 2, 4, 6… 페이지
선택적 인수 Optional ByVal EvenOrOdd As Byte 홀짝 선택 값 전달
역순 인쇄 Step -2 또는 Step -1 뒤에서부터 인쇄

자주 묻는 질문 (FAQ)

Q1. 홀수 페이지만 인쇄하려면 어떻게 하나요?

전체 페이지 수만큼 1부터 Step 2로 순환하면서 PrintOut의 from과 To에 같은 페이지 번호를 지정합니다.

Q2. Optional 인수는 어떤 역할을 하나요?

프로시저를 호출할 때 생략할 수 있는 인수로, 값이 넘어왔는지에 따라 서로 다른 처리를 하도록 할 수 있습니다.

Q3. 미리보기 대신 바로 인쇄하려면?

PrintOut의 preview 인수에 False를 넘기면 프린터로 바로 출력됩니다.

마치며

체크박스 값을 하나의 변수로 넘기고 순환문의 시작값과 Step만 바꾸면 홀수면, 짝수면, 역순 인쇄를 모두 처리할 수 있습니다.