• 최초 작성일: 2001-06-05
  • 최종 수정일: 2026-09-30
  • 조회수: 17 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 짝수 페이지 데이터 이동시키기

들어가기 전에

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

이번 시간에는 게시판에 올라온 질문 하나를 살펴봅니다.

VBA에서 페이지 끝은 어떻게 알아낼 수 있는지요.
저는 한 페이지에 두 줄의 결과물을 출력하려고 하는데 결과가 출력되는
방향은 A1, A2, A3,... 페이지 끝이면 같은 페이지 B1, B2, B3,...
페이지 끝이면 다시 다음 페이지로 넘어가 똑같은 형식으로 조건이
만족될 때까지 출력하려고 합니다.

즉 위에서 아래로 지그재그 출력을 하려고 하는데 좋은 방법이 없는지요?
도움을 부탁드립니다.

지난 주에 오튜 사이트에 놀러 갔다가 엑사모 운영진 한 분이 마침 비슷한 답변을 하신 것이 있길래 배껴다가 약간 수정해서 만들어 보았습니다.

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

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

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


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

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

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

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

짝수 페이지 데이터 이동시키기

핵심 요약: 짝수 페이지 옮기기

HPageBreaks로 페이지별 시작 행을 구한 뒤 짝수 페이지를 옆 열에 붙여 넣고 원래 행을 삭제합니다.

  • 1단계: 페이지 나누기 미리보기로 전환해 HPageBreaks 위치를 배열에 담습니다.
  • 2단계: 짝수 페이지를 복사해 바로 앞 홀수 페이지의 E열에 붙여 넣습니다.
  • 3단계: 원래 짝수 페이지 행을 아래쪽부터 삭제하고 기본 보기로 되돌립니다.

Step 1: 실행 결과

세로로 배치되어 있던 6 페이지가 가로 방향 3페이지로 줄어들었지요?

Step 2: MoveEvenPage 프로시저

코드를 보면...

Sub MoveEvenPage()
    Dim lngRow() As Long
    Dim intPage As Integer
    Dim i As Integer
    On Error GoTo ET
    '''변수를 선언해 줍니다. lngRow()라는 동적 배열 변수는 현재 시트의 각 페이지가
    '''시작되는 행 번호를 담아두기 위한 것입니다.

    Call GoToStage
    '''Stage 시트로 이동하기 위한 프로시저를 호출합니다.

    With Application
        .Cursor = xlWait
        .StatusBar = "Moving... "
        .ScreenUpdating = False
    End With
    '''작업을 진행하는 동안 커서의 모양을 모래시계 모양으로 설정하고 상태 표시줄에
    '''메시지를 표시합니다. 그리고 작업 도중 화면 갱신을 하지 않습니다. 그래야
    '''작업 시간이 조금이나마 단축됩니다.

    ActiveWindow.View = xlPageBreakPreview
    intPage = ActiveSheet.HPageBreaks.Count + 1
    ReDim lngRow(1 To intPage + 1)
    '''페이지 나누기 미리 보기 상태로 전환하여 몇 개의 페이지로 구성되어 있는지를
    '''파악합니다. 그런 다음 동적 배열 변수의 크기를 확정합니다.

    lngRow(1) = 1
    For i = 2 To intPage
        lngRow(i) = ActiveSheet.HPageBreaks(i - 1).Location.Row
    Next i
    lngRow(intPage + 1) = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
    '''순환문을 돌면서 수평 페이지 나누기가 된 행 번호를 동적 배열 변수에 하나씩
    '''담아 둡니다.

    For i = 2 To intPage Step 2
        Range("A" & lngRow(i) & ":C" & lngRow(i + 1) - 1).Copy
        Range("E" & lngRow(i - 1)).PasteSpecial xlPasteAll
    Next i
    '''짝수 번째 페이지에 있는 내용들을 복사하여 바로 앞 홀수 페이지의 오른쪽에
    '''붙여 넣습니다. 2페이지는 1페이지 옆에, 4페이지는 3페이지 옆에 놓이는 셈입니다.

    For i = intPage - (intPage Mod 2) To 2 Step -2
        Rows(lngRow(i) & ":" & lngRow(i + 1) - 1).Delete
    Next i
    Application.CutCopyMode = False
    '''붙여 넣기를 하였으면 원래의 짝수 페이지 데이터는 삭제합니다. 아래쪽부터 지워야
    '''앞쪽 페이지의 행 번호가 바뀌지 않습니다.

    ActiveWindow.View = xlNormalView
    '''화면을 기본보기 상태로 되돌립니다.
    '''아래 부분은 에러가 발생했을 경우 에러를 처리하기 위한 부분과 커서모양,
    '''화면 갱신 여부 등을 원래 상태로 되돌려 놓습니다.

ET:
    If Err > 0 Then
        MsgBox Err.Description, vbInformation, "에러 발생//By Exceller"
    Else
        MsgBox "데이터 이동작업이 완료되었습니다", vbInformation, "작업 완료//By Exceller"
    End If

    With Application
        .StatusBar = False
        .Cursor = xlDefault
        .ScreenUpdating = True
    End With
End Sub

Sub GoToStage()
    Worksheets("Stage").Select
End Sub

마무리

많이들 응용해 보시기 바랍니다.

다음 시간에...

정리 — 페이지 이동 핵심

구분 사용한 코드 역할
보기 전환 ActiveWindow.View = xlPageBreakPreview 페이지 구성 파악
페이지 수 ActiveSheet.HPageBreaks.Count + 1 전체 페이지 수
시작 행 HPageBreaks(i).Location.Row 페이지별 시작 행 번호
복사·붙여넣기 Range(...).Copy / PasteSpecial 짝수 페이지를 옆으로 이동
원본 삭제 Rows(...).Delete 짝수 페이지 원래 행 삭제

자주 묻는 질문 (FAQ)

Q1. VBA에서 페이지가 끝나는 위치는 어떻게 알 수 있나요?

ActiveSheet.HPageBreaks 컬렉션의 Location.Row 속성으로 수평 페이지 나누기가 있는 행 번호를 알 수 있습니다.

Q2. HPageBreaks.Count는 페이지 수와 같은가요?

같지 않습니다. 페이지 나누기 개수이므로 세로로 이어진 시트에서는 페이지 수가 개수보다 하나 많습니다.

Q3. 행을 삭제할 때 아래쪽부터 지우는 이유는?

위쪽 행을 먼저 지우면 아래쪽 페이지의 행 번호가 바뀌어 미리 구해 둔 위치가 어긋나기 때문입니다.

마치며

페이지 나누기 위치를 배열에 담아 두면 세로로 늘어선 데이터를 원하는 모양으로 다시 배치할 수 있습니다.