rand(life)

[vba] 코드 분석1 - 특정페이지만 골라 인쇄 본문

컴퓨터/엑셀

[vba] 코드 분석1 - 특정페이지만 골라 인쇄

flogsta 2017. 6. 12. 09:23

지식인 답변했던 것 중 쓸모있다고 생각되는 것을 기억하기 쉽게 정리해두려고 한다. 다음에 비슷한 일이 있으면 또 써먹을 수 있게..

아래는 "특정문구가 들어가 있는 페이지만 인쇄할 수 있나요?"라는 질문에 대한 답이다. 


Sub checkprint()

Dim ws As Worksheet

Dim rng As Range, c As Range

Dim str As String, strFirstAddr As String

Dim h As HPageBreak '페이지나누기 표시도 Type으로 지정할 수 있다는 것을 처음 알았다.

Dim lc As Long, i As Long

Dim lpc As Double

Dim arr() '페이지 나누기가 있는 곳의 셀 주소를 담을 배열변수


Set ws = Worksheets(1)

Set rng = ws.UsedRange

str = "인쇄할곳"


ReDim arr(1)

arr(i) = 1      '처음에는 1을 넣는다. 페이지 나누기가 하나도 없어도 1페이지는 존재하니까

    For Each h In ws.HPageBreaks   '시트안에 있는 모든 페이지나누기에 대해

    s = h.Location.Address   '페이지나누기의 주소를 s변수에 담는다

    i = i + 1

    ReDim Preserve arr(i)

    arr(i) = 1 * Mid(s, 4)    

 'mid함수는 세번째 인수를 지정하지 않으면 두번째인수부터 끝까지를 반환한다. 즉, 셀주소가 $A$까지는 공통이고, 그 뒤에 행번호가 나오기때문에, arr배열변수에는 페이지나누기가 들어간 행번호가 차곡차곡 들어가게 된다.

    Next h

    

Set c = rng.Find(str, lookat:=xlWhole)    '이제 특정 문구가 있는 곳을 찾는다

strFirstAddr = c.Address '무한 루프에 빠지지 않도록 찾은 첫셀 주소 등록

strAddr = c.Address  '다음부터 찾은 셀주소는 이 변수에 넣는다. 이후 두 개의 변수를 비교해서 루프에 빠지지 않도록 한다.


Do

lpc = Application.Match(c.Row, arr, 1)    'arr변수에 들어가있는 값은 페이지수이고, 올림차순으로 들어가 있으므로, match함수의 특징을 이용해서 특정문구를 찾은 곳의 행번호를 arr변수에서 찾는다. 세번째 인수가 1이면 작거나 같은 값중에서 최대값을 찾는다.

즉, arr변수에 페이지나누기행의 번호가 1,30,60,90,120... 이렇게 들어가 있는데 c.row가 84라면 60을 찾는다. 결국 match함수를 통해 나온 결과값 lpc는 60이 arr변수에서 위치한 곳인 3이 된다.

ws.PrintOut from:=lpc, to:=lpc  '그래서 3페이지를 인쇄한다


Set c = rng.FindNext(c)  '다음 c를 찾는다

strAddr = c.Address '찾은 곳 셀주소를 변수에 등록


Loop Until c Is Nothing Or strAddr = strFirstAddr '찾는 값이 없거나 찾은 셀주소가 처음 찾은 셀주소와 같을때까지 반복


End Sub