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