Psp*_*spl 8 arrays excel vba excel-vba cumulative-sum
我有一个整数数组值,想要找到一种计算其累积和(S = Data(1) + Data(2) + ... + Data(x))的简单方法.
我已经创建了这个函数:
Function CumulativeSum(Data() As Integer, k As Integer) As Integer
    For entry = 1 To k
        CumulativeSum = CumulativeSum + Data(entry)
    Next entry
End Function
它工作正常.但是,我想知道是否有更好的方法(主要是不使用任何额外的功能,基本上只使用excel函数Application.Sum).我在网上进行了一次小搜索,但在此基础上没有找到任何内容.
我知道我不是要求更正任何代码,我只是要求一个替代方案,这不是本论坛的真正目的.但是,我也怀疑答案可能很简单,所以...如果有人关心帮助我,我会非常非常感激!如果您找到类似问题的答案,请与我分享链接,我将删除此链接.
我非常抱歉可能缺乏明确的要求:我只是想找到一个简单的方法来计算累积和使用宏程序本身的简单函数,没有使用CumulativeSum我创建的函数或由其创建的任何其他函数用户.
如果你想从Array(a,b,c)实现像Array(a,a + b,a + b + c)那样的累积数组,那么这就是实现它的函数,如果你想传递start和结束参数:
Public Sub TestMe()
    Dim outputArray     As Variant
    Dim inputArray      As Variant
    Dim counter         As Long
    inputArray = Array(1, 2, 4, 8, 16, 32, 64)
    outputArray = generateCumulativeArray(inputArray, 1, 4)
    For counter = LBound(outputArray) To UBound(outputArray)
        Debug.Print outputArray(counter)
    Next counter
    outputArray = generateCumulativeArray(inputArray, toValue:=4)
    For counter = LBound(outputArray) To UBound(outputArray)
        Debug.Print outputArray(counter)
    Next counter
End Sub
Public Function generateCumulativeArray(dataInput As Variant, _
                                        Optional fromValue As Long = 0, _
                                        Optional toValue As Long = 0) As Variant
    Dim i                   As Long
    Dim dataReturn          As Variant
    ReDim dataReturn(0)
    dataReturn(0) = dataInput(fromValue)
    For i = 1 To toValue - fromValue
        ReDim Preserve dataReturn(i)
        dataReturn(i) = dataReturn(i - 1) + dataInput(fromValue + i)
    Next i
    generateCumulativeArray = dataReturn
End Function
关于只是对数组求和,这是这样做的方法:你可以使用WorksheetFunction.和你可以将数组作为参数传递.因此,你的所有功能,例如Average,Min,Max等:
Option Explicit
Public Sub TestMe()
    Dim k As Variant
    k = Array(2, 10, 200)
    Debug.Print WorksheetFunction.Sum(k)
    Debug.Print WorksheetFunction.Average(k)
End Sub
如果您希望从给定开始到给定结束的总和,最简单的方法可能是创建一个新数组并将其完全求和.在Python中,这称为切片,在VBA中,这可以手动完成:
Public Sub TestMe()
    Dim varArr          As Variant
    Dim colSample       As New Collection
    varArr = Array(1, 2, 4, 8, 16, 32, 64)
    colSample.Add (1)
    colSample.Add (2)
    colSample.Add (4)
    colSample.Add (8)
    Debug.Print WorksheetFunction.Sum(generateArray(varArr, 2, 4))
    Debug.Print WorksheetFunction.Sum(generateArray(colSample, 2, 4))
End Sub
Public Function generateArray(data As Variant, _
                              fromValue As Long, _
                              toValue As Long) As Variant
    Dim i                   As Long
    Dim dataInternal        As Variant
    Dim size                As Long
    size = toValue - fromValue
    ReDim dataInternal(size)
    For i = LBound(dataInternal) To UBound(dataInternal)
        dataInternal(i) = data(i + fromValue)
    Next i
    generateArray = dataInternal
End Function
我们的想法是该generateArray函数返回一个新数组.因此,它的完整总和就是你所需要的.它也适用于集合,不仅适用于数组.注意,在使用集合时,它们从索引1开始,而数组(通常)从0开始.如果要对Arrays和Collections使用相同的索引,则将generateArray函数更改为以下值:
Public Function generateArray(data As Variant, _
                              fromValue As Long, _
                              toValue As Long) As Variant
    Dim i                   As Long
    Dim dataInternal        As Variant
    Dim size                As Long
    size = toValue - fromValue
    ReDim dataInternal(size)
    If IsArray(data) Then
        For i = LBound(dataInternal) To UBound(dataInternal)
            dataInternal(i) = data(i + fromValue)
        Next i
    Else
        For i = LBound(dataInternal) To UBound(dataInternal)
            dataInternal(i) = data(i + fromValue + 1)
        Next i
    End If
    generateArray = dataInternal
End Function
或者写Option Base 1在顶部,数组将从1开始(不建议!).
尝试这个:
Sub test()
Dim arr As Variant
arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim mySum As Long, k As Long
Dim wsf As WorksheetFunction
Set wsf = Application.WorksheetFunction
k = 6
'operative line below
mySum = wsf.Sum(wsf.Index(arr, 1, Evaluate("ROW(1:" & k & ")")))
MsgBox mySum
End Sub