rand(life)

[VBA] 사소한 팁들 본문

컴퓨터/엑셀

[VBA] 사소한 팁들

flogsta 2017. 3. 17. 09:59

주문번호를 시트마다 검색하여 송장번호 출력

문제는 제목이 일정한 위치에 있지 않다는 것

......

        Set rngTitle1 = sht.Range("A1:Z10").Find("주문번호", Lookat:=xlPart)

        Set rngTitle2 = sht.Range("A1:Z10").Find("송장번호", Lookat:=xlPart)

                            '주문번호가 있는 위치와 송장번호가 있는 셀위치 파악하여 해당 셀을 range변수에 설정

                            '아무리 불규칙적이어도 설마 "A1:Z10"사이에는 제목이 있겠지라고 생각해서 넣음

            iGap = rngTitle2.Column - rngTitle1.Column

                                                           '주문번호와 송장번호가 있는 열위치 간격

            Set rng = Range(rngTitle1, sht.Cells(Rows.Count, rngTitle1.Column).End(3))

                              '주문번호가 있는 위치 범위 설정

                               주문번호가 있는 셀부터 아래로 끝까지인데 rngTitle1.Column 이 부분에 주목


                   r.Offset(0, -1).Value = c.Offset(0, iGap).Value

                        '주문번호와 송장번호가 있는 열위치 간격만큼 이동하여  송장번호를 sheet1에 기록

.........


'그런데 궁금한 것은 

        Set rngTitle2 = sht.Range(cells(1,1), cells(100,100)).Find("송장번호", Lookat:=xlPart)

이렇게 설정하니 1004 런타임 오류가 난다.

"Range 메서드 (worksheet개체의) 에서 오류가 발생하였습니다

이유를 모르겠다. 


p.s. 지식인에 질문을 올렸더니 답변이 왔다.

문을 다음과 같이 바꿔 주세요. 
sht 가 생략되면 activesheet 로 가정하게 됩니다.
이 경우에는 다른 시트의 범위를 참조해야 하므로 시트 변수를 생략하면 안되겠죠.

Set rngTitle1 = sht.Range(sht.Cells(1, 1), sht.Cells(10, 10)).Find("주문번호", Lookat:=xlPart)

-----

range 개체는 다음과 같은 형식으로 표기합니다.
Workbooks("연습.xlsm").Worksheets("Sheet1").Range("A1")

이 때 활성 문서의 활성 시트인 경우는 Workbook 과 Worksheet 를 생략하고 Range("A1") 으로 적을 수 있습니다.
즉, Range("A1") 으로 적으면 활성 문서의 활성 시트를 가정하는 겁니다.
마찬가지로, Cells(1, 1) 이라고 적은 경우에도 활성 문서의 활성 시트를 가정하는 겁니다.

sht.Range("A1:Z10") 는 Range("A1:Z10") 를 sht 라는 시트 변수로 한정하고 있으므로 여기서의 Range("A1:Z10") 는 활성 시트가 아니라 sht 시트의 Range("A1:Z10") 입니다.

sht.Range(Cells(1, 1), Cells(10, 10)) 의 경우는 Cells(1, 1) 나 Cells(10, 10) 개체를 한정하는 시트 변수가 없는 상황입니다.
앞에 있는 sht.Range(.. 의 sht 는 Cells 를 한정하는 것이 아닙니다. 각각 독립된 것입니다. 따라서, 이 경우는 Cells 앞에 sht 변수로 한정해야 하는 것입니다.