- 최초 작성일: 2002-04-16
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 페이지마다 밑줄 긋기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번에도 질문 하나를 살펴봅니다. 엑셀 2000을 쓰는데 출력물의 양식 바깥 테두리를 굵은 선으로 하는 경우가 많다고 합니다. 맨 위, 왼쪽, 오른쪽, 맨 아래 선은 전체를 지정해 굵게 하면 되지만, 중간중간 페이지가 끝나는 선에도 굵은 선을 넣어야 하는데 한두 장이면 몰라도 수십 장이 되면 큰일이라는 내용입니다. 페이지의 끝 라인을 자동으로 인식해서 원하는 범위에 굵은 선을 자동으로 넣을 수 있는 방법이 없겠느냐는 질문이었습니다.
페이지마다 밑줄 긋기
핵심 요약: 페이지 끝 행에 선 긋기
HPageBreaks로 각 페이지가 끝나는 행을 알아내고, 마지막 데이터 행과 함께 Union으로 묶어 아래쪽 테두리를 한꺼번에 그릴 수 있습니다.
- 1단계: Find 메서드로 시트의 마지막 데이터 셀을 찾습니다.
- 2단계: HPageBreaks로 각 페이지의 끝 행을 배열에 담습니다.
- 3단계: Union으로 묶은 영역에 아래쪽 테두리를 그리거나 지웁니다.
Step 1: 페이지 개념이 희박한 엑셀
엑셀은 페이지 개념이 아주 희박하여 페이지 단위로 어떤 작업을 하는 것이 쉬운 일은 아닙니다만 그렇다고 해서 불가능 한 것은 아닙니다. 버튼을 클릭해 보세요.
선택한 위치부터 시트의 마지막 데이터까지, 각 페이지가 끝나는 행의 아래쪽에 선을 그리거나 지워 주는 프로시저입니다. 선을 그릴지 말지는 메시지 상자에서 선택하도록 하였습니다.
Step 2: DrawLineEachPage 프로시저
수평 쪽 나눔(HPageBreak) 오브젝트를 이용하여 각 페이지가 끝나는 행을 알아낸 뒤 그 행의 아래쪽 테두리를 지정합니다.
Sub DrawLineEachPage()
Dim rngCurrent As Range
Dim rngLastCell As Range
Dim rngLine As Range
Dim strCaption As String
Dim hpbPBreak As HPageBreak
Dim lngRow() As Long
Dim lngEachPage As Long
Dim lngLineStyle As Long
Dim i As Integer
Dim j As Integer
Dim intCol As Integer
On Error GoTo ET
' 필요한 변수를 선언해 줍니다. 이번에는 등장 인물과 배역이 아주 다양하군요. ^^
If TypeName(Selection) <> "Range" Then
MsgBox "영역을 잘못 선택하셨습니다. 다시 확인하세요!", , "영역 선택 오류//www.iExceller.com"
Exit Sub
' 만약 선택된 개체가 Range 오브젝트가 아니라면 프로시저를 종료합니다.
Else
Set rngCurrent = Selection.Cells(1)
Set rngLastCell = FindLastCell(rngCurrent)
' 유효한 영역이 선택되었다면 선택된 영역의 첫번째 셀을 rngCurrent 변수에
' 담아 둡니다. 그런 다음 FindLastCell 이라는 사용자 정의 함수에 매개 변수로
' 넘겨 그 결과값을 받아 다시 rngLastCell 이라는 변수에 저장합니다.
' 이게 뭐 하는 짓(?)이냐 하면 현재 선택된 영역이 있는 시트의 마지막 데이터가
' 어디인가를 알아내기 위한 짓입니다. ^^
End If
ActiveSheet.DisplayAutomaticPageBreaks = True
' 페이지 구분선이 나타나도록 하고...
lngLineStyle = IIf(MsgBox("페이지마다 라인을 그릴까요?", vbYesNo, "라인 그리기//www.iExceller.com") = vbYes, xlContinuous, xlNone)
' 페이지 라인을 그릴 것인가 말 것인가를 사용자가 선택하도록 합니다.
' 원래 이 문장은,
' If MsgBox("페이지마다 라인을 그릴까요?",vbYesNo,"라인 그리기//www.iExceller.com")=vbYes Then
' lngLineStyle=xlContinuous
' Else
' lngLineStyle=xlNone
' End If
'라고 해야 할 것을 한 줄로 축약한 것입니다.
strCaption = IIf(lngLineStyle = xlContinuous, "모든 페이지에 라인을 그렸습니다!", "모든 페이지의 라인을 제거하였습니다!")
rngLastCell.Select
With ActiveSheet
intCol = .UsedRange.Columns.Count
lngEachPage = rngLastCell.Row
Set rngLine = Range(Cells(lngEachPage, 1), Cells(lngEachPage, intCol))
' 마지막 행이 있는 영역을 rngLine 변수에 담습니다.
j = .HPageBreaks.Count
' 수평 쪽 나눔 오브젝트의 수를 카운팅하여 변수에 저장합니다.
If j = 0 Then
rngLine.Borders(xlEdgeBottom).LineStyle = lngLineStyle
Else
ReDim lngRow(j - 1)
For Each hpbPBreak In .HPageBreaks
lngRow(i) = hpbPBreak.Location.Offset(-1, 0).Row
i = i + 1
Next hpbPBreak
' 한 페이지 이상이라면 사용하여 각 페이지가 끝나는 위치를 lngRow라는
' 동적 배열 변수에 차례대로 담아 둡니다.
For i = 1 To j
lngEachPage = lngRow(i - 1)
Set rngLine = Union(rngLine, Range(Cells(lngEachPage, 1), Cells(lngEachPage, intCol)))
Next i
rngLine.Borders(xlEdgeBottom).LineStyle = lngLineStyle
' 수평 쪽 나눔 되어있는 수만큼 라인을 그리거나 삭제합니다.
End If
End With
rngCurrent.Select
MsgBox strCaption, , "작업 완료//www.iExceller.com"
Exit Sub
ET:
MsgBox Err.Number & "번 에러가 발생하였습니다!", , "에러 발생//www.iExceller.com"
Err.Clear
End Sub
Step 3: FindLastCell 함수
이제 위에서 호출한 FindLastCell 이라는 사용자 정의 함수를 살펴 봅니다.
Function FindLastCell(rngX As Range) As Range
Dim strSheet As String
Dim rngFind As Range
strSheet = rngX.Parent.Name
With Worksheets(strSheet)
Set rngFind = .Cells.Find(what:="*", after:=.Cells(1), lookat:=xlPart, searchdirection:=xlPrevious)
' Find 메서드를 사용하여 현재 시트의 맨 마지막 데이터가 들어있는 셀 영역을
' rngFind 변수에 담습니다.
If rngFind Is Nothing Then
Set FindLastCell = .Cells(1)
Else
Set FindLastCell = rngFind
End If
' 아무 데이터가 없다면 첫번째 셀을, 데이터가 있다면 그 셀 영역을 함수의
' 결과값으로 되돌립니다.
End With
End Function
Find 메서드로 시트 안의 마지막 데이터 셀을 찾아 돌려주고, 데이터가 전혀 없으면 첫 번째 셀을 돌려줍니다.
참고: 페이지 나눔 정보는 프린터 설정과 용지 크기에 따라 달라집니다. 코드에서 DisplayAutomaticPageBreaks = True로 페이지 구분선이 표시되도록 한 뒤 HPageBreaks를 읽어 오는 방식이라 프린터 드라이버가 설치되어 있지 않으면 페이지 나눔을 얻지 못할 수 있습니다.
많이 응용해 보세요.
오늘은 여기까지...
정리 — 페이지 끝 라인 긋기 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 페이지 구분선 | DisplayAutomaticPageBreaks = True | 페이지 나눔 표시 |
| 끝 행 구하기 | HPageBreaks(i).Location.Offset(-1, 0).Row | 각 페이지의 마지막 행 |
| 마지막 셀 | Cells.Find("*", searchdirection:=xlPrevious) | 시트의 마지막 데이터 |
| 영역 결합 | Union | 여러 행을 한 영역으로 |
| 선 지정 | Borders(xlEdgeBottom).LineStyle | 선 그리기 또는 제거 |
자주 묻는 질문 (FAQ)
Q1. 엑셀에서 페이지별 작업이 왜 어려운가요?
엑셀은 페이지 개념이 희박하여 페이지 단위의 작업을 직접 지원하는 기능이 많지 않습니다. 대신 HPageBreaks 같은 오브젝트로 페이지 나눔 위치를 알아낼 수 있습니다.
Q2. HPageBreak 오브젝트는 무엇인가요?
수평 쪽 나눔을 나타내는 오브젝트이며, Location 속성으로 쪽 나눔이 시작되는 셀 위치를 알 수 있습니다.
Q3. 선을 지우려면 어떻게 하나요?
메시지 상자에서 아니요를 선택하면 LineStyle이 xlNone으로 지정되어 각 페이지 끝의 선이 제거됩니다.
마치며
엑셀은 페이지 개념이 약하지만 HPageBreaks를 활용하면 페이지 단위의 서식 작업도 자동화할 수 있습니다.