为了提出这个问题,我已经简化了我的问题。想象一下,我在Excel中有以下数据:
我想在VBA中对这两列执行SUMPRODUCT,但不使用内置的SUMPRODUCT函数。这是因为我的项目将变得更加复杂 - 但我只需要开始考虑这个问题。到目前为止我的代码:
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
如何让代码输出正确答案?
为了给出一些上下文,我将扩展它以适用于动态数组,并且我最终将其转换为用户定义的函数。
感谢任何帮助。
答案 0 :(得分:1)
主要问题是你只想循环一次并引用同一行。要做到这一点,你将使用一个简单的for循环,并使用计数器作为两个数组的索引。
没有理由使用循环加载数组,因为您可以直接分配值。
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
答案 1 :(得分:0)
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