- 최초 작성일: 2025-01-25
- 최종 수정일: 2026-09-27
- 조회수: 48 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 256회 - 선택 페이지 인쇄
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
워드는 쉼표(,)나 대시(-)를 이용하여 특정한 페이지 범위를 지정 인쇄할 수 있습니다.
예를 들어 1, 3, 5 ~ 7 페이지를 인쇄하려면 그림과 같이 하면 됩니다.
하지만 엑셀은 페이지 개념이 희박하기에 떨어져 있는 페이지를 한번에 인쇄할 수 있는 방법이 없습니다.
만약 1, 3, 5, 7-8 페이지를 인쇄하려면 [파일] - [인쇄] 메뉴를 이용하여 네 번을 반복해서 지정해 주어야 합니다.
떨어져 있는 페이지 한번에 인쇄하는 Code
핵심 요약: 떨어져 있는 페이지를 VBA로 한 번에 인쇄하기
엑셀의 [인쇄] 메뉴는 한 번에 하나의 페이지 범위만 지정할 수 있지만, VBA에서 입력받은 페이지를 쉼표 단위로 나눠 PrintOut을 반복하면 1, 3, 5-8처럼 떨어져 있는 페이지도 한꺼번에 인쇄할 수 있습니다.
- 입력 형식: 쉼표(,)로 구분, 연속 범위는 대시(-) 사용 (예: 1,3,5-8)
- 핵심 함수: InputBox, Split, InStr, Left, Mid, CInt
- 인쇄 명령: ActiveSheet.PrintOut From:=시작, To:=끝
- 오류 처리: On Error GoTo ET로 잘못된 입력 시 안내 메시지 표시
VBA로 떨어져 있는 페이지 인쇄하기
엑셀에서 떨어져 있는 페이지를 한꺼번에 인쇄할 수 있는 방법은 없을까요? 있으니까 Exceller가 이렇게 강좌를 진행하는 거겠지요?(^^;)
VBA로 코딩을 하면 가능합니다.
예제 파일에서 "선택 페이지 인쇄" 버튼을 클릭하고 아래와 같이 입력해 보세요. 1, 3, 4페이지와 8-10 페이지가 한번에 인쇄됩니다.
[선택 페이지 인쇄] 버튼에 연결된 코드
[선택 페이지 인쇄] 버튼에 연결된 코드를 살펴보죠.
Sub PrintSelectPages()
Dim iTotalPage As Integer ' 총 페이지 수
Dim iFrom As Integer ' 인쇄를 시작할 페이지
Dim iTo As Integer ' 인쇄를 종료할 페이지
Dim i As Integer ' For ~ Next 문에서 사용할 Flag 변수
Dim sNum As String ' InputBox에 입력받을 페이지
Dim sPage() As String ' 입력받은 문자열을 배열로 분리
Dim sMsg As String
On Error GoTo ET
sMsg = "페이지 번호를 쉼표(,)나 -로 구분하여 입력하세요." & vbCr
sMsg = sMsg & "(예: 1,3,5-8)"
iTotalPage = ActiveSheet.PageSetup.Pages.Count ' 워크시트의 총 페이지 수 파악
sNum = InputBox(sMsg, "인쇄할 페이지 입력") ' 인쇄할 페이지 입력받음
sPage() = Split(sNum, ",")
' 콤마로 구분된 문자열을 Split 함수를 이용해 분리한 후, 배열 변수의 각 배열에 저장
' 배열 변수 sPage의 최소 ~ 최대 범위까지 순환
For i = LBound(sPage) To UBound(sPage)
' sPage(i) 변수에 대시(-)가 있으면 - 위치를 기준으로 앞 부분은 발췌해서 iFrom, 뒷 부분은 iTo 변수에 저장
If InStr(1, sPage(i), "-") > 0 Then
iFrom = CInt(Left(sPage(i), InStr(1, sPage(i), "-") - 1))
iTo = CInt(Mid(sPage(i), InStr(1, sPage(i), "-") + 1))
ActiveSheet.PrintOut From:=iFrom, To:=iTo ' 해당 페이지 인쇄
Else
' 만약 전체 페이지 수보다 큰 값이 입력된 경우, 인쇄하지 않고 건너뜀
If iTotalPage >= CInt(sPage(i)) Then
ActiveSheet.PrintOut From:=sPage(i), To:=sPage(i)
End If
End If
Next i
ET: ' 오류 발생 시 실행할 레이블
If Err.Number <> 0 Then ' 오류가 발생하였을 경우...
sMsg = "인쇄할 페이지 번호를 다시 확인하세요"
MsgBox sMsg, Title:=Err.Number & ": " & Err.Description
End If
End Sub
참고: 원문 코드 수정
원문 코드의 주석에는 "전체 페이지 수보다 큰 값이 입력된 경우 전체 페이지 값으로 대체"라고 되어 있었지만, 실제 코드는 값을 대체하지 않고 If iTotalPage >= CInt(sPage(i)) Then 조건에 맞지 않으면 인쇄를 건너뜁니다. 실제 동작에 맞게 주석을 "인쇄하지 않고 건너뜀"으로 바꾸었습니다. 코드 자체는 그대로입니다.
아주 오래 전 강좌에서 홀수/짝수 페이지 인쇄하기, 역순으로 인쇄하기 등에 대해서도 소개한 기억이 납니다. 필요한 분들은 찾아보시기 바랍니다. 혹시 못 찾겠으면 알려주세요.
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI)은 다를 수 있습니다.
정리 — 떨어져 있는 페이지 한 번에 인쇄하기
| 단계 | 코드에서 하는 일 |
|---|---|
| 입력 | InputBox로 인쇄할 페이지(예: 1,3,5-8) 입력받음 |
| 분리 | Split 함수로 쉼표(,) 단위로 나누어 배열에 저장 |
| 판별 | InStr 함수로 대시(-) 유무 확인 - 있으면 범위, 없으면 단일 페이지 |
| 인쇄 | PrintOut 메서드의 From, To 인수로 해당 페이지 인쇄 |
| 오류 처리 | On Error GoTo ET로 잘못된 입력 시 안내 메시지 표시 |
자주 묻는 질문 (FAQ)
Q1. 엑셀에서 떨어져 있는 페이지를 한 번에 인쇄할 수 있나요?
[파일] - [인쇄] 메뉴에서는 한 번에 하나의 페이지 범위만 지정할 수 있어서 기본 기능으로는 불가능합니다. VBA로 입력받은 페이지를 쉼표 단위로 나눠 PrintOut을 반복하면 가능합니다.
Q2. 인쇄할 페이지는 어떤 형식으로 입력하나요?
페이지 번호를 쉼표(,)로 구분하고, 연속된 범위는 대시(-)로 표시합니다. 예를 들어 1,3,5-8처럼 입력하면 1, 3, 5~8 페이지가 인쇄됩니다.
Q3. 잘못된 값을 입력하면 어떻게 되나요?
형식에 맞지 않는 값을 입력하면 오류 처리 구문이 실행되어 '인쇄할 페이지 번호를 다시 확인하세요' 메시지가 표시됩니다. 또한 단일 페이지 번호가 총 페이지 수보다 크면 인쇄하지 않고 건너뜁니다.
마치며
엑셀에는 없는 '떨어져 있는 페이지 한 번에 인쇄'도 VBA 코드 하나면 뚝딱 해결됩니다. 예제 파일로 직접 실행해 보세요!
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.