- 최초 작성일: 2001-06-05
- 최종 수정일: 2026-09-30
- 조회수: 17 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 짝수 페이지 데이터 이동시키기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 게시판에 올라온 질문 하나를 살펴봅니다.
VBA에서 페이지 끝은 어떻게 알아낼 수 있는지요.
저는 한 페이지에 두 줄의 결과물을 출력하려고 하는데 결과가 출력되는
방향은 A1, A2, A3,... 페이지 끝이면 같은 페이지 B1, B2, B3,...
페이지 끝이면 다시 다음 페이지로 넘어가 똑같은 형식으로 조건이
만족될 때까지 출력하려고 합니다.
즉 위에서 아래로 지그재그 출력을 하려고 하는데 좋은 방법이 없는지요?
도움을 부탁드립니다.
지난 주에 오튜 사이트에 놀러 갔다가 엑사모 운영진 한 분이 마침 비슷한 답변을 하신 것이 있길래 배껴다가 약간 수정해서 만들어 보았습니다.
짝수 페이지 데이터 이동시키기
핵심 요약: 짝수 페이지 옮기기
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. 행을 삭제할 때 아래쪽부터 지우는 이유는?
위쪽 행을 먼저 지우면 아래쪽 페이지의 행 번호가 바뀌어 미리 구해 둔 위치가 어긋나기 때문입니다.
마치며
페이지 나누기 위치를 배열에 담아 두면 세로로 늘어선 데이터를 원하는 모양으로 다시 배치할 수 있습니다.