rand(life)
[VBA] 사소한 팁들 본문
주문번호를 시트마다 검색하여 송장번호 출력
문제는 제목이 일정한 위치에 있지 않다는 것
......
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 변수로 한정해야 하는 것입니다.