• 최초 작성일: 2002-04-16
  • 최종 수정일: 2026-09-30
  • 조회수: 11 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 페이지마다 밑줄 긋기

들어가기 전에

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

이번에도 질문 하나를 살펴봅니다. 엑셀 2000을 쓰는데 출력물의 양식 바깥 테두리를 굵은 선으로 하는 경우가 많다고 합니다. 맨 위, 왼쪽, 오른쪽, 맨 아래 선은 전체를 지정해 굵게 하면 되지만, 중간중간 페이지가 끝나는 선에도 굵은 선을 넣어야 하는데 한두 장이면 몰라도 수십 장이 되면 큰일이라는 내용입니다. 페이지의 끝 라인을 자동으로 인식해서 원하는 범위에 굵은 선을 자동으로 넣을 수 있는 방법이 없겠느냐는 질문이었습니다.

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

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

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


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

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

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

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

페이지마다 밑줄 긋기

핵심 요약: 페이지 끝 행에 선 긋기

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를 활용하면 페이지 단위의 서식 작업도 자동화할 수 있습니다.