Sum Up a Column
- As chris neilsen mentioned in your comments, looping an array may be more efficient than using
Sum
with Index
.
Get Column Sum
- You won't gain much by removing the number check but in return, it won't fail if there are error values.
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
Proof
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
Test Result
Populated: 1.171875
500770415 0.328125
500770415 0.9296875