2014-12-09 2 views
0

Excel VBA에서 Application.WorksheetFunction.Sumproduct를 사용하여 2 개의 배열 열을 가져 오는 방법이 있습니까? 예를 들어, A와 B가 각각 3 행 3 열 (Excel 배열이 아닌 VBA 배열) 인 두 개의 배열 인 경우 B 열의 두 번째 열과 함께 A의 세 번째 열의 부스러기를 쉽게 얻을 수 있습니까? 그렇다면 구문은 무엇입니까? 감사합니다.VBA Sumproduct on Array Columns

+0

VBA 배열이란 무엇입니까? 배열 배열 또는 실제로 2D 배열? –

+0

귀하의 질문을 시각화하여 알려주십시오. –

답변

0

OK는 WorksheetFunction.Index가 배열 배열에서도 작동하는 것처럼 보입니다. 따라서 WorksheetFunction.Index를 사용하여 세 번째와 두 번째 열을 가져오고 WorksheetFunction.Transpose를 사용하여 열의 1D 배열을 얻은 다음 WorksheetFunction.SumProduct를 사용하여이 작업을 수행 할 수 있습니다.

Sub test() 

aA = [{1,2, 3;4,5, 6;7,8, 9}] 
aB = [{10, 11,12;13, 14,15;16, 17,18}] 

'aA = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9)) 
'aB = Array(Array(10, 11, 12), Array(13, 14, 15), Array(16, 17, 18)) 

aCol3of_aA = WorksheetFunction.Index(aA, 0, 3) 
aCol2of_aB = WorksheetFunction.Index(aB, 0, 2) 

aArr1 = WorksheetFunction.Transpose(aCol3of_aA) 
aArr2 = WorksheetFunction.Transpose(aCol2of_aB) 

dSumProduct = WorksheetFunction.SumProduct(aArr1, aArr2) 
'= 3*11 + 6*14 + 9*17 = 270 

MsgBox dSumProduct 

End Sub 
0

이 워크 시트 함수를 사용하는 것보다 훨씬 빠를 것 VBA 배열을 통해 반복, 시도하고이 작업을 수행 할 WorksheetFunction.SumProduct를 사용하는 유혹 할 수도 있지만. 작은 테스트에서 나는 다른 게시 된 답변보다 x40 성능 향상에 대해 얻었습니다.

이것은 사용자가 수행 할 수있는 간단한 예입니다. 입력 및 오류 처리에 대한 유효성 검사를 추가해야합니다.

Function ArraySumProduct(aA As Variant, aB As Variant, col1 As Long, col2 As Long) As Variant 
    Dim i As Long 
    Dim dSumProduct 

    For i = LBound(aA) To UBound(aA) 
     dSumProduct = dSumProduct + aA(i, col1) * aB(i, col2) 
    Next 
    ArraySumProduct = dSumProduct 
End Function