在不使用Excel VBA中的内置函数的情况下执行Sumproduct

时间:2016-09-21 19:43:27

标签: excel vba

为了提出这个问题,我已经简化了我的问题。想象一下,我在Excel中有以下数据:

现金流量| DiscountFactor

11,851 | 0.9901

96,401 | 0.9679

80,412 | 0.9494

我想在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

如何让代码输出正确答案?

为了给出一些上下文,我将扩展它以适用于动态数组,并且我最终将其转换为用户定义的函数。

感谢任何帮助。

2 个答案:

答案 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