Reputation: 48
I've simplified my problem for the purposes of asking this question. Imagine I have the following data in Excel:
I want to perform a SUMPRODUCT on these two columns in VBA but without using the built in SUMPRODUCT Function. This is because my project is going to get more complicated than that - but I just need to figure this out to begin with. My code so far:
Sub DiscountedCashflows()
Dim CashFlows(1 To 3) As Variant
Dim DiscountFactors(1 To 3) As Variant
Dim CashFlowsElms 'Elements in the cashflow array
Dim DiscountFactorElms 'Elements in the DiscountFactors array
Sheet1.Select
'Populating Cashflows array
Dim Counter1 As Long
For Counter1 = LBound(CashFlows) To UBound(CashFlows)
CashFlows(Counter1) = Range("A1").Offset(Counter1, 0).Value
Next Counter1
'Populating DiscountFactors array
Dim Counter2 As Long
For Counter2 = LBound(DiscountFactors) To UBound(DiscountFactors)
DiscountFactors(Counter2) = Range("B1").Offset(Counter2, 0).Value
Next Counter2
'Loop through the elements in the first array
For Each CashFlowsElms In CashFlows
'Loop through the elements in the second array
For Each DiscountFactorElms In DiscountFactors
x = x + 1
'Multiply the two array elements together
Cells(x, 1) = CashFlowElms * DiscountFactorElms
Next DiscountFactorElms
Next CashFlowsElms
MsgBox "Answer is..."
Erase CashFlows
Erase DiscountFactors
End Sub
How do I get the code to output the correct answer?
To give some context I'll be expanding this to work for dynamic arrays and I'll eventually turn it into a user defined function.
Any help is appreciated.
Upvotes: 0
Views: 511
Reputation: 152465
The main problem is you only want to loop once and refer to the same row. To do that you would use a simple for loop and use the counter as the index of both arrays.
There is no reason to load the arrays with a loop, as you can assign the values directly.
Sub DiscountedCashflows()
Dim CashFlows() As Variant
Dim DiscountFactors() As Variant
Dim i As Long
Dim temp As Double
With Worksheets("Sheet16")
'Populating Cashflows array
CashFlows = .Range("A2:A4").Value
'Populating DiscountFactors array
DiscountFactors = .Range("B2:B4").Value
'Loop through the elements in the first array
For i = LBound(CashFlows, 1) To UBound(CashFlows, 1)
temp = temp + (CashFlows(i, 1) * DiscountFactors(i, 1))
Next i
End With
MsgBox "Answer is..." & temp
End Sub
Upvotes: 1
Reputation: 29421
Function MySumProduct() As Double
Dim CashFlows As Variant
Dim DiscountFactors As Variant
With Sheet1
CashFlows = Application.Transpose(.Range("A1", .Range("A1").End(xlDown)).Value)
DiscountFactors = Application.Transpose(.Range("B1", .Range("B1").End(xlDown)).Value)
End With
For i = LBound(CashFlows) to UBound(CashFlows)
MySumProduct= MySumProduct + CashFlow(i) * DiscountFactor(i)
Next i
End Function
Upvotes: 0