对多维数组VBA的特定列的所有行求和

问题描述 投票:0回答:2

我有一个不同维度的数组。一个特定的列 (11) 有一个我需要为数组中的所有项目聚合的数量。

例子:

MyArray(1,11) = 2000 + MyArray(2,11) = 1000 + MyArray(3,11) = 3000 = 6000

有没有一种方法可以在不循环遍历数组的情况下对数组中所有行的特定维度求和?

我正在尝试这样的事情无济于事:

With Application.WorksheetFunction
        
OppAmount = .Sum(.Index(CurDealArr, DealsTable.ListColumns("AMOUNT").Index))
    
End With
excel vba
2个回答
0
投票

例子:

Sub SumOfArray()
    Dim dataArr() As Variant
    Dim totalSum As Double
    Dim lastRow As Long
    
   dataArr = Range("A1:K10").Value

    ' Get the last row of the array
    lastRow = UBound(dataArr, 1)
    
    ' Calculate the sum
    totalSum = Application.WorksheetFunction.Sum(Application.WorksheetFunction.Index(dataArr, 0, 11))
    
    ' Display the sum
    MsgBox "The sum of column 11 is: " & totalSum
End Sub

0
投票

总结一个专栏

  • 正如 chris neilsen 在您的评论中提到的那样,循环数组可能比使用
    Sum
    Index
    更有效。

获取列总和

  • 删除数字检查不会有太多好处,但作为回报,如果有错误值,它也不会失败。
Function GetColumnSum( _
    ByVal Data As Variant, _
    ByVal ColumnIndex As Long) _
As Double

    Dim Value, r As Long, Sum As Double
    
    For r = LBound(Data, 1) To UBound(Data, 1)
        Value = Data(r, ColumnIndex)
        If VarType(Value) = vbDouble Then
            Sum = Sum + Value
        End If
    Next r
    
    GetColumnSum = Sum

End Function

证明

Option Explicit

Private Const rCount As Long = 1000000
Private Const cCount As Long = 10
Private Const ColumnIndex As Long = 7
Private Const MaxNumber As Long = 1000
Private Data As Variant

Sub TestSum()
    
    'Data = Empty
    
    Dim t As Double
    
    If IsEmpty(Data) Then
t = Timer
        ReDim Data(1 To rCount, 1 To cCount)
        Dim r As Long, c As Long
        For r = 1 To rCount
            For c = 1 To cCount
                Data(r, c) = Int(MaxNumber * Rnd + 1)
            Next c
        Next r
Debug.Print "Populated: ", Timer - t
    End If
    
    ' Using the function:
t = Timer
    Debug.Print GetColumnSum(Data, ColumnIndex), Timer - t

    ' Using 'Sum' and 'Index'
t = Timer
    With Application '.WorksheetFunction
        Debug.Print .Sum(.Index(Data, 0, ColumnIndex)), Timer - t
    End With

End Sub

测试结果

Populated:     1.171875 
 500770415     0.328125 
 500770415     0.9296875 
© www.soinside.com 2019 - 2024. All rights reserved.