아마도 어느 정도 돌아가는 문법은 알고 무엇을 어떻게 짤것인가에만 집중하기 때문이 아닐까 싶다. 아직은 그닥 쓸일이 별로 없다는 것이고, 주변에 물어볼 사람이 생겼다는 것이 좋다. 예전에는 정말 하다가 모르면 미칠 것 같고 그랬는데, 지금은 그럭저러 해볼만 하다. 그리고 회사에서 그나마 여유가 있어서 짬짬이 vba 코드 보면서 딴짓을 해도 될 수 있다는게 다행이다.


 이렇게 얼른 실력을 키워 놔야 나중에 정말 필요한 시점에는 내가 헤매지 않고 잽싸게 따라 갈 수 있다는 것도 장점이겠지. 무엇보다 이것저것 돌려보면서 만질 수 있다는게 가장 큰 강점이라는 생각을 새삼스럽게 해본다. 프로그램이라는게 정말 고차원적인 시스템상의 로직이라면 몰라도 비지니스 로직이 가미된 것이라면 그리 어렵지 않다. 내가 원하는 게 무엇인지 그리고 그것을 가장 빠르게 전달할 수 있는게 무엇인지만 고민하면 된다.


 그리고 초짜 프로그래머가 가장 빨리 배울 수 있는 방법은 날밤까는게 아니라고 생각한다. 기본적인 문법과 응용에 대한 감을 키워 놓은 다음에, 고수들이 짜는 프로그램을 이해하는 것이 중요하다고 본다. 회사에서도 SAS를 나만큼 오래한 사람이 있기는 하지만, 그렇게 잘하는 사람들을 본적이 별로 없다. 나야 회사에 들어와서 이 분야의 일만 한, 어찌보면 I자형 커리어를 자랑하는 사람이다. 그렇지만 내게도 1만시간이라는 벽을 깨기 전에는 늘 SAS는 어렵기만 한 존재였다.


 그런데 SAS에 대해서 정말 잘 이해하는 계기는 엉뚱하게도 C, Java, VBA를 개인적으로 공부하면서였다. 요즘 대학원 과제물 하면서 R을 사용하게 되는데 하면 할수록 SAS의 통계 프로시저나 함수에 대해서 돌아보게 된다. 아이러니 하게도 SAS에 대해서 새로운 이해, 고민은 C에서의 루핑이나 자바에서의 상속 그리고 VBA의 다양한 배열을 통해서였다. 정말 SAS를 잘하려면 통계와 C를 배우는 것이 중요하다고 생각이 든다. 대충 짜려면 한없이 허접한 SAS 스크립터가 되겠지만 정말 잘 짜놓으면 왠만한 툴보다 낫다고 생각한다.


 나중에 나이를 들으면 무엇을 할까 고민을 하기보다 그시간에 새로운 것을 배우고 도전하려고 한다. 지금 읽는 책을 정독하면서 모든 프로그램을 다 손으로 쳐보면서 많은 생각을 하게 된다. 원래 이 책을 2번은 볼려고 했는데 벌써 한 번을 볼 시간을 날려버렸다. 여름이 오기전에 얼른 끝내고 다시 시작했으면 좋겠다.

반응형

'VBA' 카테고리의 다른 글

집중력의 한계  (0) 2012.04.30
where to download ccrp timer  (0) 2012.04.25
오늘은 간만에 짧게 짜서 쉽게 끝내는 것을 해봤다.  (0) 2012.04.07
이제는 잊어버리는게 더 빠르네.  (0) 2012.04.04
dual loop sequence number  (0) 2011.09.24

 ㅋㅋ 원래 배열을 잘 사용하지 않고 바로 매크로로 사용하는 것을 좋아했는데. 가끔은 배열을 이용하는 것이 훨씬 빠를때가 더 많다. 오늘 같은 경우가 그랬는데, 의외로 아주 깔끔하고 빨리 끝나는 프로그램을 짰다. 예전에 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 를 쓰지만 그닥 어려운 문제는 별로 존재하지를 않는다. 그리고 새로운 것을 별로 시도하지 않으니까 더욱 그렇기도 하고 말이다. ㅋㅋ 가장 어려웠던 것이 작년에 프로그래밍 했던 고객등급 시뮬레이셔닝 하는 프로그램이었다. 그 때에는 정말 죽다가 살아날 정도로 힘들었던 기억이 있다. 아마, 매크로랑 배열을 제대로 쓸줄 몰랐다면, 정말 하다가 팀장에게 '저는 정말 못하겠습니다.'라고 말했을지도 모른다.

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

반응형

오늘은 오랜만에 VBA를 응용해서 무언가를 만들어 보려고 했는데, 글쎄 까먹어 버리고 말았다. 아예 머리가 하얗게 되면서 아무것도 기억이 나지 않았다. 으흐흐흐... 요즘 상태가 안좋다는 것은 알았는데, 이정도로 안좋을줄은 몰랐다.

 중간고사가 3주전인데, 이 머리로 무슨 중간고사랑 자격증 시험을 보겠다는 것인지 나도 걱정이 앞선다.

반응형
Sub macro4()
   Dim i As Integer
   Dim j As Integer
   Dim k As Integer
   
   Dim starter As Integer
   Dim closer  As Integer
   
   k = 0
   starter = 0
   closer = 9
   
   
   For i = starter To closer
      For j = starter To closer
         k = i * (closer + 1) + j + 1
         With ActiveCell
            .Offset(i, j) = k
         End With
      Next j
   Next i
End Sub

반응형

+ Recent posts