- 최초 작성일: 2008-02-12
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 특정한 조건을 충족하는 페이지만 출력하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
설 연휴를 잘 보내셨는지 안부를 묻기 무색하게…
수차례의 전란에도 굳건하던 대한민국의 국보 1호인 남대문이 전소 되었습니다. 대한민국의 수도, 그것도 서울 시내 한 복판에서 어이없는 방화로 말입니다.
도대체 관리를 어떻게 해 왔으며, 그 많은 소방차와 인력이 투입되고서도 조기에 진압되지 않았는지는 Exceller가 열을 올리지 않더라도 분개하는 분들이 많을 터이므로 더 이상 언급하지 않겠습니다만, 참으로 개탄스러울 따름입니다.
1995년 중앙청 철거, 2005년 양양 낙산사 화재에 이어 또 한번, 우리 후손에게 씻을 수 없는 과오를 남기게 되었습니다.
이런 일이 제발 재발되지 않기를 빌어봅니다. 부질없는 바람에 그칠 것 같다는 생각을 떨치기 어렵지만서도…
우리 사이트에 '통계로 세상보기'를 연재하고 계시는 무지개타고(조석현)님께서 이와 관련하여 블로그에 다음과 같은 글을 올려 놓으셨군요. 원문 보기
미래를 예측하기 위해서는 무엇이 필요할까?
간단히 생각해보면, 미래로 가서 보면 된다. 그리고 당연히 현재로 돌아와야 한다. 그래야 미래를 얘기 할 수 있으니... (얄궂게도 미래를 다룬 영화 대부분은 해피엔딩일지언정 디스토피아다... -_-;;)
그런데 적어도 현재의 과학수준으로는, 미래로 갔다 현재로 되돌아 온다는 것이 불가능하다는 것은 누구나 알고 있다.
그래서 이용되는게 확률이다. 쉽게는 가능한 경우의 수를 모두 산정해 확률을 구하는 것이고, 좀더 나아가서는 확률밀도함수를 밝혀내 확률을 구하는 것이다. 이렇게 얻은 확률을 통해 발생 가능성이 높다면 높은 대로, 낮다면 낮은 대로 미래를 대비하는 것이다(대표적인 것이 보험이다. 그러나 보험은 발생 가능성 자체를 높이거나 낮추지는 못한다).
확률의 공리에 의하면, 어떤 사건이 발생될 확률은 0과 1 사이에 존재한다(0≤확률≤1). 이는 역으로 어떤 사건이 발생될 확률이 0 일 수도 있지만, 반드시 0 은 아니라는 것이다. 그래서 매우 낮은 가능성일지라도 미래는 알 수 없기에 그에 대비해야 한다.
지난 밤에 숭례문이 잿더미로 변했다. 몇몇 기사를 보면 이미 숭례문의 화재 가능성이 제기된 것을 알 수 있다.
- 1년전부터 경고 목소리...
- 숭례문 화재참사, 노무현 탓? 이명박 탓?
그리 희박한 가능성으로 여겨지지 않음에도 불구하고, 화재에 대비하지 않았다. 그 결과 우리는 600년 역사와 자존심을 잃고 말았다.
역사 속에는 한산도대첩 처럼 내세우고 싶은 것도 있고, 삼전도비 처럼 감추고 싶은 치욕도 있다. 그리고 끝까지 밝혀내야 할 숙제도 있다. 이 모두가 우리의 정체성을 구성하고 있는 요소들이고 후대에게 물려줄 유산이다. 그런데 그 중 하나가 (원인이 뭐든) 안타깝게도 우리의 무관심으로 사라진 것이다.
이에 감히 제안한다.
이제는 유산으로 물려줄 수 없으니 후대에 교훈으로 남기기 위해, 소실된 숭례문의 복원을 반대하며 잿더미인 숭례문 그대로를 보전하자.
그래서 현 세대를 욕하고, 다시는 이런 어처구니 없는 사태가 발생되지 않기를 바란다.
남대문에 불이 난 주 원인이 "접근을 개방한 탓"이라는 주장에는 실소를 금할 수 없게 됩니다.
특정한 조건을 충족하는 페이지만 출력하기
핵심 요약: 값이 0인 페이지는 건너뛰고 인쇄하기
시트가 여러 개이고 시트마다 페이지가 여러 장인 문서에서, 페이지별로 정해진 위치의 셀 값이 0이면 종이를 아끼기 위해 인쇄하지 않도록 만드는 VBA 코드입니다.
- 1단계: For Each로 시트를 돌면서 이름이 5로 시작하는 시트만 골라냅니다.
- 2단계: ExecuteExcel4Macro("get.document(50)")로 전체 페이지 수를 구합니다.
- 3단계: 페이지마다 판단 셀 값을 확인해 0이 아닌 페이지만 PrintOut으로 인쇄합니다.
Step 1: 어떤 질문이었을까요?
이번 강좌는 아래와 같은 질문에서 출발합니다.
질문 하나
안녕하세요. 출력에 관한 매크로를 만들고 싶은데 잘 안되서 고수님들의 가르침을 받고자 질문올립니다.
위 페이지가 1페이지 이며 똑같이 30페이지 까지 있습니다. 그러나 빨간 셀이 0값이 나올경우 출력이 안되게 하고 싶은데요. 병합된 셀이라 안되는건지 이유를 잘 모르겠네요… (중략)…
A SHEET 에 1-30 페이지
B SHEET 에 1-30 페이지
………………………………………..
Z SHEET 에 1-30 페이지
이렇게 있는데 쉬트를 다 적용해서 만드는 방법도 알고 싶습니다.
무슨 질문인지 이해가 가시지요?
5112, 5113, 5114 등과 같은 시트가 여러 개 있습니다. (실제 보내주신 예제 파일에는 이것 말고도 시트가 여러 개 더 있었습니다만, 편의상 몇 개만 남겨두고 삭제하였습니다)
해당 시트들을 클릭해 보면 빨간색으로 표시한 부분에 숫자값이 들어있는데, 이 값이 '0'인 경우에는 종이가 아까우니까 아예 출력되지 않도록 해 달라는 얘기입니다.
아래 버튼을 누르면 실제로 10여 장의 종이가 인쇄되므로 코드를 먼저 살펴보신 다음, 꼭 인쇄를 해서 봐야겠다는 생각이 드는 분만 클릭해 보세요!(괜히 나중에 아까운 종이 낭비되었다고 Exceller 욕하기 없깁니다!! ^^;)
Step 2: 코드 살펴보기
Sub PrintMoreThanZero()
Dim i As Integer
Dim intTotalPage As Integer
Dim wrkSheet As Worksheet
Dim strSheetName As String
On Error Resume Next
For Each wrkSheet In Worksheets
If Left(wrkSheet.Name, 1) <> "5" Then GoTo E1
'시트 이름을 확인해서 '5'로 시작되지 않는 경우에는 아래 구문들을 실행하지
'않도록 하기 위한 것입니다.
wrkSheet.Activate
intTotalPage = ExecuteExcel4Macro("get.document(50)")
'아주 오래간만에 XLM 매크로(Excel4Macro)를 사용하였군요.
'XLM 매크로(Excel4Macro)에 대한 보다 자세한 설명은 VB0051 강좌를 살펴보세요.
'get.document(50)은 현재 워크시트의 전체 페이지 수를 구해줍니다.
For i = 1 To intTotalPage
If Cells((i - 1) * 18 + 13, 23) = 0 Then
'여기서 18을 곱한 다음 13을 더한 것은 왜일까~요?
'답까지 알려드리면 재미가 없으니까 5112 시트로 가서 빨간색 셀의 주소들을
'빈 종이에 적어 보시면 쉽게 이해하실 수 있으리라 생각합니다.
'Doing Nothing
Else
ActiveWindow.SelectedSheets.PrintOut From:=i, To:=i, Copies:=1
End If
Next i
E1:
Next wrkSheet
ET:
If Err <> 0 Then
MsgBox Err.Description, , "에러 번호 : " & Err.Number
Err.Clear
End If
End Sub
원문 오류 수정: 코드 맨 끝의 오류 처리 구문에 Error.Clear로 적혀 있던 부분을 Err.Clear로 바로잡았습니다. VBA에서 오류 정보를 지우는 것은 Err 개체의 Clear 메서드입니다.
생각보다 그리 복잡한 코드는 아님을 알 수 있습니다. 반복되는 패턴, 규칙을 발견하면, 그것을 프로그래밍 하는 것은 식은 죽 먹기입니다.
'왜 18을 곱하고 13을 더했을까?'의 답: 예제의 각 시트는 한 페이지가 18행 단위로 나뉘어 있고, 빨간색 셀은 각 페이지의 13번째 행, 23번째 열(W열)에 있습니다. 그래서 i번째 페이지의 판단 셀은 (i - 1) * 18 + 13행이 됩니다. 1페이지는 13행, 2페이지는 31행, 3페이지는 49행… 이런 식이죠. 여러분의 문서에서는 이 숫자를 각자의 양식에 맞게 바꿔 주세요.
다음 시간에 또…
정리 — 페이지 조건부 인쇄 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 시트 순회 | For Each wrkSheet In Worksheets | 통합 문서의 모든 시트를 차례로 확인 |
| 대상 시트 선별 | Left(wrkSheet.Name, 1) <> "5" | 이름이 5로 시작하지 않는 시트는 건너뜀 |
| 전체 페이지 수 | ExecuteExcel4Macro("get.document(50)") | 현재 시트의 페이지 수를 반환 |
| 판단 셀 위치 | Cells((i - 1) * 18 + 13, 23) | i번째 페이지의 빨간색 셀(W열) 값을 참조 |
| 인쇄 | PrintOut From:=i, To:=i, Copies:=1 | 값이 0이 아닌 페이지만 1부 인쇄 |
자주 묻는 질문 (FAQ)
Q1. 시트의 전체 페이지 수를 구하는 다른 방법은 없나요?
이 강좌에서는 XLM 매크로인 ExecuteExcel4Macro("get.document(50)")를 사용했습니다. 최근 버전에서는 ActiveSheet.PageSetup.Pages.Count 속성으로도 페이지 수를 구할 수 있습니다. 다만 인쇄 설정이나 프린터 환경에 따라 결과가 달라질 수 있으니 실제 문서로 확인해 보세요.
Q2. 종이를 낭비하지 않고 테스트해 보려면 어떻게 하나요?
PrintOut 메서드에 Preview:=True 인수를 추가하면 인쇄하지 않고 미리 보기 화면이 표시됩니다. 코드가 원하는 페이지만 골라내는지 확인한 다음 Preview 인수를 지우고 실제로 인쇄하세요.
Q3. 병합된 셀이라서 값을 못 읽는 건가요?
병합된 셀의 값은 병합 영역의 왼쪽 위 셀에 저장됩니다. 그러므로 Cells 속성으로 병합된 셀을 참조할 때는 그 영역의 왼쪽 위 셀 위치를 지정해야 합니다. 판단 셀이 병합되어 있다면 병합 영역의 첫 번째 셀 주소를 확인해 보세요.
마치며
반복되는 패턴만 찾아내면 페이지 수만큼 순환문을 돌려서 원하는 페이지만 골라 인쇄하는 것은 그리 어렵지 않습니다. 각자의 양식에 맞게 행 간격과 판단 셀 위치만 바꿔서 활용해 보세요!