'### WorksheetFunction의 SumProduct 사용 방법 Sub testSumproduct()
Dim i As Integer, resultSum As Double, resultCount As Double Dim array1, array2, array3 Dim sht As Worksheet: Set sht = Sheets("DATA") Dim findString1 As String: findString1 = sht.Range("F4") Dim findString2 As String: findString2 = sht.Range("G4") array1 = sht.Range("B4:B10") array2 = sht.Range("C4:C10") array3 = sht.Range("D4:D10")
For i = LBound(array1) To UBound(array1) array1(i, 1) = IIf(array1(i, 1) = findString1, 1, 0) Next i
For i = LBound(array2) To UBound(array2) array2(i, 1) = IIf(Left(array2(i, 1), 4) = findString2, 1, 0) Next i
'### For를 사용하여 순환문으로 처리하는 방법 Sub alternativeSolution()
Dim i As Integer, resultSum As Double, resultCount As Double Dim sht As Worksheet: Set sht = Sheets("DATA") Dim rngTarget As Range: Set rngTarget = sht.Range("B4:D10") Dim findString1 As String: findString1 = sht.Range("F4") Dim findString2 As String: findString2 = sht.Range("G4")
For i = 1 To rngTarget.Rows.Count If rngTarget(i, 1) = findString1 And Left(rngTarget(i, 2), 4) = findString2 Then resultSum = resultSum + rngTarget(i, 3) resultCount = resultCount + 1 End If Next i
데이터의 유형에 따라 답변이 달라질 수 있다고 말씀드렸는데.. 음..
다음에 질문하실때는 첨부파일 부탁드립니다.
DRM때문에 메일로도 힘들면.. 셀 영역을 복사해서 게시판에 붙여주세요..
그러면 텍스트라도 확인하고 좀 더 구체적인 답변이 가능하겠습니다.
- 각설.. -
VBA에서도 SUMPRODUCT함수를 사용할 수도 있습니다만..
대개의 경우는 순환문과 IF문으로 사용해서 처리합니다.
순환문을 사용하여 처리하는 방법을 추천합니다.
굳이 어렵게 Application.WorksheetFunction.SumProduct()를 구현할 필요가 없는 것이지요..
자세한 내용은 첨부파일을 참고하시기 바랍니다.
다운받기 : abyul_QnA_VBA_20111101_SUMPRODUCT-1.xls
'### WorksheetFunction의 SumProduct 사용 방법
Sub testSumproduct()
Dim i As Integer, resultSum As Double, resultCount As Double
Dim array1, array2, array3
Dim sht As Worksheet: Set sht = Sheets("DATA")
Dim findString1 As String: findString1 = sht.Range("F4")
Dim findString2 As String: findString2 = sht.Range("G4")
array1 = sht.Range("B4:B10")
array2 = sht.Range("C4:C10")
array3 = sht.Range("D4:D10")
For i = LBound(array1) To UBound(array1)
array1(i, 1) = IIf(array1(i, 1) = findString1, 1, 0)
Next i
For i = LBound(array2) To UBound(array2)
array2(i, 1) = IIf(Left(array2(i, 1), 4) = findString2, 1, 0)
Next i
resultCount = Application.WorksheetFunction.SumProduct(array1, array2)
resultSum = Application.WorksheetFunction.SumProduct(array1, array2, array3)
Dim strMsg As String
strMsg = "계산 결과입니다." & Chr(10) & _
findString1 & "과 " & findString2 & "의 조건을 만족하는" & _
"항목은 " & resultCount & "개이며," & Chr(10) & _
"수량의 합계는 " & resultSum & "입니다."
MsgBox strMsg, vbInformation, "계산 결과입니다."
End Sub
'### For를 사용하여 순환문으로 처리하는 방법
Sub alternativeSolution()
Dim i As Integer, resultSum As Double, resultCount As Double
Dim sht As Worksheet: Set sht = Sheets("DATA")
Dim rngTarget As Range: Set rngTarget = sht.Range("B4:D10")
Dim findString1 As String: findString1 = sht.Range("F4")
Dim findString2 As String: findString2 = sht.Range("G4")
For i = 1 To rngTarget.Rows.Count
If rngTarget(i, 1) = findString1 And Left(rngTarget(i, 2), 4) = findString2 Then
resultSum = resultSum + rngTarget(i, 3)
resultCount = resultCount + 1
End If
Next i
Dim strMsg As String
strMsg = "계산 결과입니다." & Chr(10) & _
findString1 & "과 " & findString2 & "의 조건을 만족하는" & _
"항목은 " & resultCount & "개이며," & Chr(10) & _
"수량의 합계는 " & resultSum & "입니다."
MsgBox strMsg, vbInformation, "계산 결과입니다."
End Sub