Кумулятивная сумма массива

у меня есть целочисленный массив значений и я хочу найти простой способ вычисления его кумулятивной суммы (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 функция, которую я создал, или любая другая функция, созданная пользователем.

3 ответов


попробуйте это:

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

если вы хотите достижение кумулятивного массива массив как массив (a, A+b, a+b+c) из массива (a,b, c), то это функция для его достижения, если вы хотите передать начальные и конечные параметры:

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. Если вы хотите использовать ту же индексацию для массивов и коллекций, измените функцию 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 (Не рекомендуется!).


для кумулятивной суммы попробуйте следующее

Function CumulativeSum(Data() As Integer, k As Integer) As Integer
    Dim tempArr
    tempArr = Data
    ReDim Preserve temp(0 To k - 1)
    CumulativeSum = WorksheetFunction.Sum(tempArr)
End Function

EDIT:

Sub Demo()
    Dim MyArray
    Dim i As Long
    MyArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

    Debug.Print MyArray(LBound(MyArray))
    For i = LBound(MyArray) + 1 To UBound(MyArray)
        MyArray(i) = MyArray(i - 1) + MyArray(i)
        Debug.Print MyArray(i)
    Next i
End Sub

над массивом обновлений кода arr С
1, 2, 3, 4, 5, 6, 7, 8, 9
к
1, 3, 6, 10, 15, 21, 28, 36, 45