728x90

아직도 범위 지정을 신경쓰지 않고 한방에 훅하고 해결을 못하고 있다.

Sheet 와 Sheet 간에 데이터를 복사하거나 참조하여 계산하거나 할 때 셀의 구간범위 지정하는 것 때문에 신경쓰는 일이 없도록 샘플을 만들었다.

Range 를 단순하게 설정하는 것은 아주 쉽고 엄청많다. 하지만 Sheet 가 서로 다를 때 구간설정하는 것을 조금이라도 실수를 하면 에러가 발생하는 걸 몇차례 경험했다.

엑셀 VBA 를 조금씩 배워가면서 터특한 것을 중심으로 더 나은 VBA 코드로 만들 수 있는 것은 재정리를 하거나 삭제를 해둬야겠다. 막상 참고해서 뭘 좀 하려고 하면 별 도움이 안되는 것도 눈에 보인다.

범위설정을 다음부터는 신경쓰지 않고 한번에 해결하기 위해서 기록해둔다.


range_setting.vbs


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


블로그 이미지

Link2Me

,