我有一个不同维度的数组。一个特定的列 (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
例子:
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
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