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

제품:   Excel 버전:   공통
검색어:   배열수식, Variant
제목:   배열수식과 Variant
     
 

새 페이지 1

  STEP> 살펴보기


함수라는 것이 보통 하나의 값을 돌려줍니다. 그런데 종종 여러 개의 값을 돌려주어야 하는 경우가 생깁니다. 이런 경우 참조에 의한 전달을 사용할 수 있지만,
오늘은 참조에 의한 전달 대신 Variant형을 사용하여 여러 개의 값을 돌려주는 함수를 다루어 보고자 합니다.

Variant형은 배열수식과 관련이 있습니다. 즉 Variant형을 돌려주는 Function프로시져는 워크시트에서 배열수식으로 값을 돌려줍니다. 그리고 VBA코드에서는 배열의 형태로 돌려줍니다.

‘배열수식’을 들으면 필자가 가장 먼저 생각하는 함수가 행렬의 곱을 구하는 MMULT()함수입니다. 사실 이 함수를 처음 사용하면서 “배열수식”이라는 낯선 용어와 Ctrl+Shift+Enter 라는 낯선 키 조합을 접하게 되었으니 그럴만 하죠.

워크시트 함수인 MMULT()를 사용하여 다음과 같이 두 개의 행렬의 곱을 구하였습니다.

Sub MulMatrix()
    Dim MatA(1 To 2, 1 To 3) As Double
    Dim MatB(1 To 3, 1 To 2) As Double
    Dim MatC 

    MatA(1, 1) = 3
    MatA(1, 2) = 4
    MatA(1, 3) = 7
    MatA(2, 1) = 5
    MatA(2, 2) = 6
    MatA(2, 3) = 1 

    MatB(1, 1) = 2
    MatB(1, 2) = 1
    MatB(2, 1) = 3
    MatB(2, 2) = 5
    MatB(3, 1) = 6
    MatB(3, 2) = 2 

    MatC = Application.WorksheetFunction.MMult(MatA, MatB) 

    Dim r   As Long
    Dim c   As Long 

    For r = LBound(MatC, 1) To UBound(MatC, 1)
        For c = LBound(MatC, 2) To UBound(MatC, 2)

            Debug.Print MatC(r, c)
        Next
    Next

End Sub

위에서 MatC는 Variant형 변수이며 워크시트에선 배열수식 형태로 결과를 돌려주는 MMULT()함수의 결과를 담게 됩니다. 이를 조사식에 넣어두고 관찰을 하노라면 다음 그림과 같이 2x2의 배열입니다.

이번에 역으로 이렇게 계산한 결과를 워크시트에서 사용하도록 함수로 변경해볼까요?

Function MulMatrix() As Variant
    Dim MatA(1 To 2, 1 To 3) As Double
    Dim MatB(1 To 3, 1 To 2) As Double   

    MatA(1, 1) = 3
    MatA(1, 2) = 4
    MatA(1, 3) = 7
    MatA(2, 1) = 5
    MatA(2, 2) = 6
    MatA(2, 3) = 1

    MatB(1, 1) = 2
    MatB(1, 2) = 1
    MatB(2, 1) = 3
    MatB(2, 2) = 5
    MatB(3, 1) = 6
    MatB(3, 2) = 2

    MulMatrix = Application.WorksheetFunction.MMult(MatA, MatB)
End Function

위의 MulMatrix 프로시져는 Variant형을 돌려주는 Function프로시져입니다. 따라서 워크시트에선 배열수식으로 다음 그림과 같은 결과를 얻게 됩니다.