9월 18 2015
엑셀(EXCEL) – 가로 세로 서로 다른 방향으로 설정된 두 시트의 교차 양면 출력
엑셀 관련 아질게에 올라오는 질문들을 보면 어찌보면 황당한 것도 많고 업무에서 실제로 데이터의
가공에 힘들고 반복적인 수작업으로 시간만 빼앗기고 업무 효율은 떨어지는 악순환에서 합리적인
해결책을 찾고자 지푸라기라도 잡는 심정으로 질문을 올리시는 분이 많으시더군요.
http://www.clien.net/cs2/bbs/board.php?bo_table=kin&wr_id=3532541
(엑셀 2007 sheet1과 sheet2 한꺼번에 양면인쇄 질문입니다.)
어떻게 보면 심플한 해결 방법이 있습니다. 수작업!!! 일단 Sheet1 전체를 출력하고 다시 출력된 종이를
맞추어 트레이에 넣고 그냥 양면인쇄 옵션없이 출력하는 방법입니다. 그런데 한두장이면 문제가 없지만
엑셀이란 프로그램 자체가 대량의 데이터를 다루다보 니 몇십장이 넘어갈 수도 있다는 것이 문제지요.
제가 양면인쇄되는 프린터가 없어서 정확하다고는 말씀드리기가 어려우나 내용으로 판단해보건데
출력시 Sheet1 전체를 출력하고 Sheet2를 출력하다 보니 양면 인쇄 옵션을 선택하게 되면 Sheet1의
1면과 2면이 양면으로 출력되고 Sheet2도 마찬가지 인 것으로 이해가 됩니다.
참 난해한 문제입니다. 머리를 이리 굴리고 저리 굴려봐도 답이 보이질 않는군요. 그러나 궁하면 통하는 법
pdf를 이용하기로 해 봅니다. 엑셀에서 출력 옵션으로 pdf로 출력하는 것이 있는데 이것을 이용하면 해결할
방법이 보입니다.
VBA Editor로 Module 추가하시고 아래 코드를 붙여넣기 합니다.
Option Explicit
Sub Prt_Dbl_Page()
‘ f: 앞면 세로, b : 뒷면 가로 접두어
Dim fp_cnt As Integer, bp_cnt As Integer
Dim i As Integer, prt_cnt As Integer
Dim f_cnt As Integer, b_cnt As Integer
Dim shtFore As Worksheet
Dim shtBack As Worksheet
f_cnt = 1
b_cnt = 1
‘ 출력되는 과정은 굳이 볼 필요가 없어 속도를 위해서 업데이트 중지
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set shtFore = Sheets(“ForePort”)
Set shtBack = Sheets(“BackLand”)
‘ 앞면을 세로로 출력 설정
shtFore.Activate
shtFore.PageSetup.Orientation = xlPortrait
fp_cnt = ExecuteExcel4Macro(“get.document(50)”)
‘ 뒷면을 가로로 출력 설정
shtBack.Activate
shtBack.PageSetup.Orientation = xlLandscape
bp_cnt = ExecuteExcel4Macro(“get.document(50)”)
If fp_cnt > bp_cnt Then
prt_cnt = fp_cnt
Else
prt_cnt = bp_cnt
End If
‘ 임시로 pdf화일 만들 폴더를 설정, 물론 먼저 만들어 두어야…
ChDir “C:\Temp\”
‘ pdf로 만들어지 각 페이지의 병합을 편하게 하기위해
‘ 문서를 이름순으로 정리하여 병합할 수 있도록 함
For i = 1 To prt_cnt
shtFore.ExportAsFixedFormat _
Type:=xlTypePDF, Filename:=i & “1” & “.pdf”, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, from:=f_cnt, to:=f_cnt, _
OpenAfterPublish:=False
shtBack.ExportAsFixedFormat _
Type:=xlTypePDF, Filename:=i & “2” & “.pdf”, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, from:=b_cnt, to:=b_cnt, _
OpenAfterPublish:=False
‘ 한장 한장 출력하도록 함
f_cnt = f_cnt + 1
b_cnt = b_cnt + 1
Next
Application.ScreenUpdating = True
End Sub
코드는 딱히 어려운 코드가 아닙니다. 세로 출력할 시트와 가로 출력할 시트를 설정하고 그 자료의 페이지
수를 알아내고 제일 큰 페이지 수 만큼 프린터를 하라는 것입니다. 그리고 그 프린터를 할 때에 종이로
직접하지 말고 pdf화일로 만들라는 것인데 세로출력과 가로출력을 한장씩 번갈아 출력해서 각각으로
pdf로 만들어 특정 폴더에 저장하라는 프로시져입니다.
내용 중에 페이지 병합을 위하여 1페이지에 양면으로 들어갈 것을 예상해서 접미사 1,2를 붙여 저장해서
특정 폴더를 이름순으로 정렬해서 Merge(병합)시킬 때 편하게 화일을 선택할 수 있도록 해 두었습니다.
…
여기서 자동으로 pdf로 병합하는 루틴을 구걸해서 찾았는데 이것이 구버전 API라서 사용하기가 번거럽고
해서 무료로 제공되는 pdf Tool을 이용해 병합하기로 해 봅니다. 여기서는 pdftk를 사용하기로 합니다.
다른 Tool들도 인터페이스만 다르지 결과는 똑같으므로 아무거나 사용하셔도 됩니다.
https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
http://angusj.com/pdftkb/
http://www.vb-helper.com/howto_pdf_merger.html
이제 인쇄 명령을 누르면 자동으로 Sheet1 한페이지, Sheet2 한페이지가 지속적으로 지정된 특정 폴더에
pdf로 저장되고 이 화일들을 pdf Tool로 묶어서 양면인쇄 옵션을 켜시고 출력하시면 됩니다. 힘들군요!
제가 양면인쇄되는 프린터가 없고 경험도 없어서 이 내용이 이론적으로만 만들어진 것이기에 잘 안되면
프린터 없는 제 잘못입니다? … 여하튼 pdf로 각각 만들어 두었으니 프린터 가지신 분께서 이리 저리 병합
해 보시면서 잘 될 수 있도록 하는 것은 사용자 몫으로 돌립니다.
첨부 화일 : 20150918-서로 다른 방향으로 세팅된 2시트의 교차 양면 출력
10월 2 2015
엑셀(EXCEL) – 두 영역 비교하여 같은 값 추출 및 시트별로 분리
추석 연휴로 인해 며칠 지나지 않았는데도 벌써 내일 주말이 되었습니다. 별다른 일도 없고 해서
저번 아질게에 올라온 다중 영역 필터링에 대해 글을 쓰게 되었는데 아질게에 아무리 찾아보아도
관련 글이 보이지 않네요. 이제 늙으니 기억력에 문제가 생기는 …
저번에 팁란에 각 시트를 통합하고 그 통합된 시트에서 특정 데이터를 추출하는 법을 올렸습니다.
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=286941
(엑셀(EXCEL) – 시트 통합, 월간년간보고서 작성 및 특정 자료(대리점) 추출)
이제 그 반대로 두 영역의 데이터를 상호 비교하여 같은 것이 있으면 추출하는 방법을 보겠습니다.
추출할 데이터가 몇 가지 되지 않으면 그냥 필터링을 해서 추가하고 또 필터링해서 추가하고 하면
되지만 예제에는 속도를 위해 몇 가지 데이터밖에 넣지를 않았지만 비교할 데이터가 몇백개 이상
넘어가면 수작업으로는 무리가 있습니다.
이제 VBA Editor 여시고 Module하나 만드시고 아래 코드를 복사하여 붙여넣기합니다.
코드 중간중간에 주석 달아놓았으니 필요한 부분을 수정, 첨삭하시어 사용하기 바랍니다.
한 루틴은 데이터를 비교하여 한 시트에 모아 주는 루틴이고 한 루틴은 각 데이터별로 시트를
만들어 분리해 주는 루틴입니다.
Option Explicit
Sub Ext_Same_Value()
Dim cnt As Integer
Dim rngCell As Range, rngTgt As Range
Dim rngR As Range, rngRef As Range
Dim tgt As Worksheet
‘ 경고 메시지 금지 및 속도를 위해 업데이트 중지
Application.DisplayAlerts = False
Application.ScreenUpdating = False
‘ 추출해서 붙여넣기할 데이터 시트가 기존에 있으면 삭제
For Each tgt In Worksheets
If tgt.Name = “ExtData” Then
tgt.Delete
End If
Next tgt
‘ 새 시트를 워크시트 제일 마지막에 ExtData라는 이름으로 추가
Set tgt = Worksheets.Add(after:=Worksheets(Worksheets.Count))
tgt.Name = “ExtData”
‘ 추출할 데이터 영역과 추출할 참조 영역 설정
Set rngTgt = Worksheets(“Data”).Range(“B:B”).SpecialCells(xlTextValues)
Set rngRef = Worksheets(“Ref”).Range(“A:A”).SpecialCells(xlTextValues)
‘ 두 영역을 순환하면서 같은 데이터가 있으면 추출 시트에 복사
For Each rngCell In rngTgt
For Each rngR In rngRef
If rngCell = rngR Then
tgt.Range(“A1”).Offset(cnt, 0).Value = rngCell.Offset(0, -1).Value
tgt.Range(“A1”).Offset(cnt, 1).Value = rngCell.Offset(0, 0).Value
tgt.Range(“A1”).Offset(cnt, 2).Value = rngCell.Offset(0, 1).Value
tgt.Range(“A1”).Offset(cnt, 3).Value = rngCell.Offset(0, 2).Value
cnt = cnt + 1
Exit For
End If
Next rngR
Next rngCell
‘ 보기 좋게 자동 칼럼 맞춤
tgt.Columns.AutoFit
‘ 경고 메시지 및 업데이트 갱신
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Sub Ext_Same_Value_To_Sheet()
Dim cnt As Long
Dim rngCell As Range, rngTgt As Range
Dim rngR As Range, rngRef As Range
Dim tgt As Worksheet
‘ 데이터 영역과 참조 영역 선택
Set rngTgt = Worksheets(“Data”).Range(“B:B”).SpecialCells(xlTextValues)
Set rngRef = Application.InputBox(“분리할 참조 영역 선택”, Type:=8)
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Sheets(“Ref”).Activate
For Each rngR In rngRef
‘ 추출할 데이터의 시트가 있으면 삭제
For Each tgt In Worksheets
If tgt.Name = rngR Then
tgt.Delete
End If
Next tgt
‘ 추출할 데이터의 시트를 데이터 이름으로 추가
Worksheets.Add after:=ActiveSheet
ActiveSheet.Name = rngR
‘ 제목행 만듦
With Range(“A1”)
.Offset(0, 0).Value = Sheets(“Data”).Range(“A1”).Offset(0, 0).Value
.Offset(0, 1).Value = Sheets(“Data”).Range(“A1”).Offset(0, 1).Value
.Offset(0, 2).Value = Sheets(“Data”).Range(“A1”).Offset(0, 2).Value
.Offset(0, 3).Value = Sheets(“Data”).Range(“A1”).Offset(0, 3).Value
End With
‘ 순환하면서 같은 데이터가 있으면 새로 만든 시트에 추가
For Each rngCell In rngTgt
If rngR = rngCell Then
cnt = cnt + 1
With Range(“A1”)
.Offset(cnt, 0).Value = rngCell.Offset(0, -1).Value
.Offset(cnt, 1).Value = rngCell.Offset(0, 0).Value
.Offset(cnt, 2).Value = rngCell.Offset(0, 1).Value
.Offset(cnt, 3).Value = rngCell.Offset(0, 2).Value
End With
End If
Next rngCell
cnt = 0
Columns.AutoFit
Next rngR
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
분리해야할 참조 영역이 정해져 있지 않아 특정 데이터 영역에서 추출해야하는 경우에는 아래의
팁을 응용하여 분리할 참조 영역을 중복되지않게 추출하고 그 추출된 데이터를 이용하여 두 영역을
비교하여 필요한 작업을 하시면 추출 관련해서는 이 두 팁을 이용하면 못할 것이 없을 것입니다.
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=286263
(엑셀(EXCEL) – 임의 영역 중복항목 제거 루틴을 응용한 다대다(多對多) 항목 역전개(기준항목
변경))
첨부 화일 : 20151002-두 영역 비교하여 같은 값 추출 및 시트별로 분리
By vinipapa • 무른모 • 0 • Tags: 시트 분리, 엑셀, 영역비교 추출, 팁