ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [VBA/Tip] Array 사용 시 Lbound() 문제
    코딩/vba 2023. 3. 27. 08:04
    728x90

    배열 작업을 할 때 일반적으로 루프문에서 Lbound()..Ubound()로 순환을 정하는데, 대부분의 경우는 배열 시작을 0으로 해서 문제가 없지만 Range를 Variant Array로 변환시켜 작업할 때는 1로 순환을 시작해서 곤란하다.

    당장 작업한 경우는 쉽게 어떤 배열인지 아니까 순환 시작점이 고민스럽지 않은데, 오래 된 코드를 수정할라치면 뭐가 뭔지 내가 만들어 놓고도 이해가 안된다.

    그리고 자주 쓰는 코드들은 라이브러리 형태로 사용하니까 이런 경우 배열을 구분못해 생기는 오류가 종종 생긴다.

    매일 코딩을 하는게 아니라 그때 그때 필요할 때 하니까 이런 일이 생긴다.

    이건 왜 인덱스가 0이고 이건 또 왜 1이냐? 이런 문제가 부지기수다.

    이런 문제로 배열이 산으로 가버리고 만다.

    그래서 이런 문제를 고민하다 다음부터는 인덱스를 신경쓰지 않기 위해 Lbound를 별도로 처리하는 변수를 추가시켜야 했다.

    물론 시간이 지나면 왜 이런 뻔한 코드를 넣어놨을까 한심하다 하면서 생각없이 지워버릴 수도 있겠지만서도...

    그래서 블로그에라도 적어놓으면 나중에 '아... 이래서 저랬구나..' 하고 생각할 수 있을 듯 하다.

    아마추어로서 코딩을 하다보면 의외로 내가 어리석게 보이는 경우가 많다.

    뭔가를 고민해서 만들어놓고선 나중엔 까먹고 '내가 왜 이랬을까...' 하니 한심하다...

     

    설명

    아래의 경우처럼, lbound값이 0인 경우는 문제가 없지만 1인 경우는 case 2와 4처럼 시작점이 달라져 버린다.

    l = LBound(varArray, 1)
    
    For i = l To UBound(varArray, 1)
        Cells(1 + i - l, 1) = i
        ' l=0 인 경우, 1+i-l = 1+0-0 = 1 (case 1)
        ' l=1 인 경우, 1+i-l = 1+1-1 = 1 (case 2)
        ' l이 없는 경우,
        ' lbound()=0, 1+i = 1+0 = 1 (case 3)
        ' lbound()=1, 1+i = 1+1 = 2 (case 4)
    Next

    이래서 아마추어는 피곤하다.

    전문 프로그래머도 이런 고민을 할까?

    순환 시작 같은 것조차도 오류를 발생시키고 원인을 찾기 위해 시간을 잡아먹는 귀신이 된다.

    전문적인 알고리즘을 배우지 못한 탓이다.

    인터넷으로 코딩을 뒤지다 보면 어떤 패턴들이 보이는데, 그게 모두 이런 오류를 경험한 사람들이 관용적으로 패턴을 만드는 게 아닌가 싶다.

    728x90

    댓글

Designed by Tistory.