배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   배열의 새로운 발견
제목:   배열의 새로운 발견
     
 

새 페이지 2

  STEP>배열에 대해서

[현상과 원인]

오늘은 배열에 대한 이야기를 하고자 합니다. 엄숙한 표정으로 말하자면 같은 데이터형의 집합이 배열입니다. 그러나 뭐 그리 딱딱하게 할 필요가 있나요? 그저 떨이로 처리하기 위해 여러 개의 변수를 묶어 놓은 거라고 보면 되겠죠.

보통 배열하면 가로,세로가 일정한 직사각형의 매트릭스를 생각할 수 있습니다. 그래서

Dim A(10,20)

으로 배열을 선언하면 가로와 세로가 11개, 21개인 정사각형의 메모리라고 봅니다. (실제 배열은 가로세로를 따지는 메모리는 아니지만)

배열과 관련하여 자주 사용하는 함수가 Array()함수입니다. 이것은 매개변수를 원소로 하는 배열을 만들어 주는 역할을 합니다. 혹시 익숙치 못한 독자분을 위해 엑셀의 도움말을 빌리자면,

Array 함수 예제


 아래 예제에서는Array 함수를 사용하여 배열을 포함하는 Variant를 반환합니다.

Dim MyWeek, MyDay
MyWeek = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")

' 하위 제한 범위가 1로 지정되었다고 가정한 값을 반환합니다.
' (Option Base 문 사용)
MyDay = MyWeek(2)    ' MyDay가 "Tue"를 포함하고 있습니다.
MyDay = MyWeek(4)    ' MyDay가 "Thu"를 포함하고 있습니다.
 

주의할 점은 Array()함수가 만들어준 배열을 받으려면 자격조건이 Variant형 변수이어야 한다는 점입니다.

[방법]

그러나 대개의 사용자들이 Array()함수는 1차원 배열만  만들 수 있는 것으로 생각합니다. 다음의 코드는 그러한 고정관념을 깨는 것입니다.

Private Array1()
Private Array2()
Private Array3()
Private ArrayOfArrays As Variant

Sub Test()
    Dim i       As Long
    Dim j       As Long
    ReDim Array1(1 To 10)
    ReDim Array2(1 To 10)
    ReDim Array3(1 To 10)

ArrayOfArrays = Array(array1, Array2, Array3)

    For j = 0 To 2
        For i = 1 To 10
            ArrayOfArrays(j)(i) = i * (j + 1)
        Next i
    Next j

        For j = 0 To 2
           For i = 1 To 10
                 Debug.Print ArrayOfArrays(j)(i);
        Next i
        Debug.Print
    Next j
End Sub

Array()함수가 매개변수로서 Variant형을 받고, 되돌려주는 것도 Variant형을 사용한다는 점은 이용한 것입니다. 이 코드에 따르면 ArrayOfArrays변수는 3 by 10형식의 2차원의 배열이 됩니다.

또한 위에서는 Array1, Array2, Array3변수의 차원을 모두 10개로 하였지만 각 변수의 차원들 달리한다면 필자가 위에서 처음 얘기한 직사각형의 메모리가 아니라 삼각형의 메모리를 만들 수 있습니다.
 

  Tip> Array()함수
Array()함수를 이용하지 않는 경우

앞서 Array()함수를 이용하여 만든 불규칙한 배열을 이번에는 Redim만으로 만들 수 있습니다. 다음의 코드는 3 by n형태의 불규칙한 배열을 만듭니다. 아래의 코드 중 ReDim Array1(1 To Rnd() * 20 + 1)은 난수 만큼의 배열을 만듭니다.

Private ArrayOfArrays As Variant

Sub Test()
     Dim i As Long
     Dim j As Long

     ReDim ArrayOfArrays(1 To 3)
     Dim Array1

     For j = 1 To 3
        ReDim Array1(1 To Rnd() * 20 + 1)
        For i = 1 To UBound(Array1)
           Array1(i) = i * (j + 1)
        Next i
        ArrayOfArrays(j) = Array1
     Next j

     For j = 1 To 3
         For i = 1 To UBound(ArrayOfArrays(j))
             Debug.Print ArrayOfArrays(j)(i);
         Next i
         Debug.Print
     Next j

End Sub