아직도 범위 지정을 신경쓰지 않고 한방에 훅하고 해결을 못하고 있다.
Sheet 와 Sheet 간에 데이터를 복사하거나 참조하여 계산하거나 할 때 셀의 구간범위 지정하는 것 때문에 신경쓰는 일이 없도록 샘플을 만들었다.
Range 를 단순하게 설정하는 것은 아주 쉽고 엄청많다. 하지만 Sheet 가 서로 다를 때 구간설정하는 것을 조금이라도 실수를 하면 에러가 발생하는 걸 몇차례 경험했다.
엑셀 VBA 를 조금씩 배워가면서 터특한 것을 중심으로 더 나은 VBA 코드로 만들 수 있는 것은 재정리를 하거나 삭제를 해둬야겠다. 막상 참고해서 뭘 좀 하려고 하면 별 도움이 안되는 것도 눈에 보인다.
범위설정을 다음부터는 신경쓰지 않고 한번에 해결하기 위해서 기록해둔다.
Sub 구간범위지정()
Dim sht1, sht2 As Worksheet '// 시트(Sheet)를 넣을 변수
Dim rngDB, rngAll As Range
Dim rngT, rngC As Range
Dim i&, n&, startRow, endRow As Long '// 오버플로우를 경험후 무조건 Long 으로 설정
Dim openMsg As String
Application.StatusBar = True
openMsg = "시작행을 입력하는 방식이면 Yes를 눌러주세요 " & vbCr & vbCr
openMsg = openMsg & "기본 시작행을 선택하려면 No를 눌러주세요" & vbCr
If MsgBox(openMsg, vbYesNo) = vbYes Then
startRow = InputBox("시작할 행의 수를 입력하세요")
If startRow = vbNullString Then Exit Sub '// 취소 선택시 매크로 중단
Else
startRow = 2 '// 시작행 지정
End If
If Not IsNumeric(startRow) Then Exit Sub '// 입력한 값이 숫자가 아닌 경우 매크로 중단
Set sht1 = Sheets("data") '// data 워크시트를 sht1 으로 지정
Set sht2 = Sheets("category") '// category 워크시트를 sht2 로 지정
Set rngAll = sht1.Range(sht1.Cells(startRow, "D"), sht1.Cells(Rows.Count, "D").End(3))
Set rngDB = sht2.Range(sht2.Cells(2, "C"), sht2.Cells(Rows.Count, "C").End(3))
endRow = sht1.Cells(Rows.Count, "D").End(3).Row '// D열의 값이 있는 마지막셀의 행번호
실제 계산을 위한 코딩
결과가 끝났음을 알려주는 Msgbox 처리
End sub
계속 코드를 만들어서 사용하다보니 이것도 좀 불편하다.
그래서 새롭게 정리해서 사용하는 코드는 아래와 같다.
물론 위의 코드와 사용하는 용도는 약간 다르지만 sRow, eRow 를 Selection 개념이랑 같이 적용하여 편리하다.
Dim C, rngAll As Range
Dim sRow, eRow As Long '// 시작할 행의 변수
Dim cnt%
Dim myValue As String
Dim v
Application.DisplayStatusBar = True
cnt = Selection.Rows.Count
sRow = Selection.Row
myValue = sRow & "/" & sRow + cnt - 1
v = InputBox("시작할 행의 수를 입력하세요", , myValue)
If InStr(v, "/") > 0 Then
sRow = Trim(Split(v, "/")(0))
eRow = Trim(Split(v, "/")(1)) '// 마지막 행
Else
sRow = v
End If
If sRow = vbNullString Then Exit Sub '// 취소 선택시 매크로 중단
If sRow <= 2 Then sRow = 2
If Not IsNumeric(sRow) Then Exit Sub '// 입력한 값이 숫자가 아닌 경우 매크로 중단
If eRow Then
Set rngAll = Range(Cells(sRow, "A"), Cells(eRow, "A")) '// 열의 끝행을 지정
Else
Set rngAll = Range(Cells(sRow, "A"), Cells(Rows.Count, "A").End(3))
End If
'업무 능력 향상 > 엑셀 VBA 기초' 카테고리의 다른 글
[VBA기초] 편리한 범위 지정(시작행, 마지막행) (0) | 2015.06.04 |
---|---|
[VBA기초] ASC(아스키)코드 (0) | 2015.05.23 |
[VBA기초] 번호제거 (0) | 2015.05.11 |
[VBA기초] 테두리선 그리기 (Borders 속성 이용) (1) | 2015.05.07 |
[VBA기초] Find 를 이용해서 원하는 자료 찾기 (4) | 2015.05.06 |