반응형

안녕하세요. 

 

홍**님이 메일로 질문을 하셨습니다.

반갑습니다....
데이터의 양이 많습니다.
 ABCD 열에 50,000행약 1,000 페이지)의 자료가 있습니다.
이 자료를 인쇄하여 책으로 만들려면

A4용지 1장 분량을 에 5 단으로 나누어서
왼쪽 단에 1페이지의 ABCD 열의 자료 를 복사 입력
다음단에 2페이지의 ABCD 열의 자료  를 복사 입력
3째 단에 3페이지의 ABCD 열의 자료  를  복사  입력
4째 단에 4페이지의 ABCD 열의 자료  를 복사 입력
마지막 제일 오른쪽 단에  5페이지의 ABCD 열의 자료  를 복사 입력

2째 장에도
ABCD 열의 6. 7. 8. 9. 10페이지 복사 입력

이런식으로 노가다를 할려니 하루종일 걸립니다.
간단한 방법이나 획기적인 방법 또는 아주쉬운 방법이 있을까요?
부디 현답을 부탁드립니다.
감사합니다.

 

결론을 먼저 이야기 하면 엑셀의 인쇄 기능으로 문제를 해결할 수 없습니다.

 

그렇다고 아예 방법이 없는 것은 아닙니다.

VBA를 이용해 데이터를 원하는 모양으로 정리할 수 있습니다.

 

완성 파일 다운로드

일정한 개수를 기준으로 나누고 합치기.xlsm
1.47MB

 

데이터 파일이 첨부되어 있지 않아서 임의로 만들었습니다.

A~D열, 50001행까지 데이터를 입력하고, 1행에는 제목을 입력했습니다.

[페이지 레이아웃]-[페이지 설정]-[인쇄 제목]을 선택해서 [반복할 행]1행을 입력했습니다.

다른 항목은 기본 값으로 두고 용지 방향가로로 바꿨습니다.

 

[보기]-[통합 문서 보기]-[페이지 나누기 미리 보기]를 선택해서 확인하니 28개 행까지 한 페이지로 나뉩니다.

실제 1페이지는 첫번째 줄에 제목 행이 있고, 아래로 데이터 28개 행이 있게 됩니다.

 

출력 예시를 만들어 몇 개 행을 한 페이지로 할 것인지 정해야 합니다.

 

여기서는 데이터 행 28개, 5단으로 구성합니다.

 

<Alt + F11>을 눌러 VBE를 실행합니다.

[삽입]-[모듈]을 선택해 모듈을 추가하고, [삽입]-[프로시저]를 선택해 실행 프로시저를 만듭니다.

이제 적절하게 코드를 작성합니다.

Public Sub 실행()
    Dim S1 As Worksheet
    Dim S2 As Worksheet
    
    Set S1 = Sheets("Sheet1")
    Set S2 = Sheets("Sheet2")
        
    Const 증가 = 28
    Const 출력단 = 5
    Const 끝행 = 50000
    
    작업행 = 2
    출력행 = 2
    단 = 1
    
    Application.ScreenUpdating = False
    t1 = Timer
    
    Do While 작업행 < 끝행 And S1.Cells(작업행, 1) <> ""
        출력열 = 1 + (단 - 1) * 4
        
        S1.Range(Cells(작업행, 1), Cells(작업행 + 증가 - 1, 4)).Copy
        S2.Range(Cells(출력행, 출력열).Address).PasteSpecial xlPasteValues
    
        단 = 단 + 1
        
        If 단 > 출력단 Then
            단 = 1
            출력행 = 출력행 + 증가
        End If
        
        작업행 = 작업행 + 증가
        DoEvents
    Loop
    
    Application.ScreenUpdating = True
    
    MsgBox "실행시간 : " & Format(Timer - t1, "0.00") & "초"
End Sub

프로시저를 실행하면 한참 시간이 흐른 뒤 메시지 창을 보여 줍니다.

실행시간은 컴퓨터 사양에 따라 차이가 있습니다.

 

Sheet2 시트에 결과가 표시됩니다.

적당한 서식을 적용해 인쇄합니다.

 

코드 중 데이터에 따라 수정해야 할 부분은 증가, 출력단, 끝행 상수입니다.

만약 행 수를 기준으로 하지 않고 다른 기준을 적용하려면 코드를 많이 수정해야 합니다.

 

Application.ScreenUpdating은 프로그램이 실행되는 동안 변경된 내용을 화면에 표시하거나 하지 않도록 설정합니다.

화면 갱신을 하지 않으면 휠씬 빠르게 실행됩니다.

DoEvents는 반복문 안에서 프로그램 제어권을 넘기는 역할을 합니다.

반복문에 문제가 생겨 무한루프하는 경우 프로그램을 멈출 수 있도록 추가했습니다.

Timer는 현재 시간을 나타내는 개체로 프로그램 실행 시간을 확인하기 위해 사용했습니다.

 

엑셀에게 비정형의 작업을 하도록 명령을 내리기 위해 VBA를 배울 필요가 있습니다.

 

필요하신 분께 도움이 되길 바랍니다.

반응형

+ Recent posts