ㅋㅋ 원래 배열을 잘 사용하지 않고 바로 매크로로 사용하는 것을 좋아했는데. 가끔은 배열을 이용하는 것이 훨씬 빠를때가 더 많다. 오늘 같은 경우가 그랬는데, 의외로 아주 깔끔하고 빨리 끝나는 프로그램을 짰다. 예전에 C를 공부하면서 루핑이나 분기제어를 배웠다면 VB를 하면서 가장 익숙해진 개념은 바로 배열이다. 실제 상당히 많은 자료를 가져다 쌓아 놓을 곳이 없으므로 어쩔 수 없이 배열을 쓰는 방법 외에는 없다.

 C를 배울 때에는 기본적인 개념만 배워야 했으므로 쓸 일이 별로 없는데, VBA는 당장 이런저런 실전형 프로그램을 짜야 하므로 자잘하게 쓸데가 많다. 주료 변수의 값들을 개별적인 변수를 정해서 넣기 보다는 배열을 정해 놓고 일정값을 홀라당 때려 넣으면 된다.

 오늘의 삽질 하나?

 잘 모르면서 제멋대로 선언을 함부로 했을 때에는 쌍코피 터진다가 오늘의 결론입니다.

Option Explicit


Private Sub kj()

    Dim ColCnt As Integer

    Dim RowCnt As Integer

    Dim CellCnt As Integer

    Dim Rng As Range

    Dim i As Integer, j As Integer, k As Integer

    Dim product As Variant

    Dim year_mth As Variant

    Dim tbl() As Variant

    

    product = Array("A", "B", "C", "D", "E", "F", "G", "H", "I")

    year_mth = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

    

    ReDim tbl(UBound(product) * UBound(year_mth), 3)


    ColCnt = ActiveSheet.UsedRange.Columns.Count

    RowCnt = ActiveSheet.UsedRange.Rows.Count

    CellCnt = ColCnt * RowCnt

    Set Rng = ActiveSheet.UsedRange

    'Debug.Print Rng(0)


    For i = 0 To UBound(product)

      For j = 0 To UBound(year_mth)

         tbl(i, j) =

      Next j

    Next i

End Sub



Private Sub kj24()

   Dim product(3) As Integer

   Dim mth(3) As Integer

   Dim cnt() As Integer

   Dim tbl() As Variant

  ' Dim tbl(15, 2) As Variant

   Dim i As Integer, j As Integer

   Dim k As Integer

   

   ReDim cnt((UBound(product) + 1) * (UBound(mth) + 1) - 1)

   ReDim tbl(0 To UBound(cnt), 0 To 2)

   'ReDim tbl(0 To ((UBound(product) + 1) * (UBound(mth) + 1) - 1), 0 To 2)

   

   For i = 0 To UBound(product)

      product(i) = i

   Next i

   For i = 0 To UBound(mth)

      mth(i) = i

   Next i

      For i = 0 To UBound(cnt)

      cnt(i) = i

   Next i

   

   k = 0

   For i = 0 To UBound(product)

      For j = 0 To UBound(mth)

         tbl(i, 0) = product(i)

         tbl(i, 1) = mth(j)

         tbl(i, 2) = cnt(k)

         k = k + 1

         Debug.Print tbl(i, 0)

         Debug.Print tbl(i, 1)

         Debug.Print tbl(i, 2)

      Next j

   Next i

End Sub



Private Sub kj31()

   

   Dim product() As Variant

   Dim year_mth() As Variant

   Dim cnt() As Variant

   Dim tbl() As Variant '<= 요부분을 제가 Object로 선언했지요.

   Dim i As Integer, j As Integer, k As Integer

    

    

   product = Array("A", "B", "C", "D", "E", "F", "G", "H", "I")

   year_mth = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

   'Debug.Print UBound(product)

   'Debug.Print product(0)

    

   ReDim cnt((UBound(product) + 1) * (UBound(year_mth) + 1) - 1)

   ReDim tbl(0 To UBound(cnt), 0 To 2)

   'Debug.Print UBound(cnt)

    

   For i = 0 To UBound(cnt)

      cnt(i) = i + 1

      'Debug.Print cnt(i)

   Next i

    

   k = 0

   For i = 0 To UBound(product)

      For j = 0 To UBound(year_mth)

         tbl(i, 0) = product(i) '<= 그랬더니 요기부터 문제가 발생하더군요

                                '당연하죠, 이런 망할 Object로 선언된 것에다가

                                '억지로 Variant를 밀어 넣을려고 하니까 문제가 생겼죠.

                                '더군다나 에러 메시지는 전혀 엉뚱한게 나왔고 다음 검색해서

                                '간신히 문제를 해결했답니다. 기가 막혀서 화도 않나더군요.

         tbl(i, 1) = year_mth(j)

         tbl(i, 2) = cnt(k)

         k = k + 1

         Debug.Print tbl(i, 0)

         Debug.Print tbl(i, 1)

         Debug.Print tbl(i, 2)

      Next j

   Next i

   Debug.Print tbl(0, 0)


End Sub

 다음부터는 좀 더 조심하면서 선언을 해야겠다. 그나저나, 이거 하느라 거의 1시간 반을 날렸다. 그래도 내가 이런거 좋아한다는 확신이 들었다. ㅋㅋ 취미로 하는 코딩이라면 열심히 해도 좋을 것이다, 이걸 일로서 한다면 무척이나 힘들겠지만 말이다.

 회사에서는 SAS 를 쓰지만 그닥 어려운 문제는 별로 존재하지를 않는다. 그리고 새로운 것을 별로 시도하지 않으니까 더욱 그렇기도 하고 말이다. ㅋㅋ 가장 어려웠던 것이 작년에 프로그래밍 했던 고객등급 시뮬레이셔닝 하는 프로그램이었다. 그 때에는 정말 죽다가 살아날 정도로 힘들었던 기억이 있다. 아마, 매크로랑 배열을 제대로 쓸줄 몰랐다면, 정말 하다가 팀장에게 '저는 정말 못하겠습니다.'라고 말했을지도 모른다.

 아, 이제는 정말 자야겠다.

반응형

+ Recent posts