Core Question
How can I perform repeated CountIf()
s on a range as efficiently (performance-wise) as possible?
Concerns in Detail
Range to Array
Since each read/write to a spreadsheet results in slower VBA code, it is advisable to do so as few times as possible. Normally, if someone is repeatedly reading/writing to a range, he or she should first save that range to an array, perform the operations to the array, and then do a final read or write to the spreadsheet if necessary.
Example Values and Code
How can I use perform CountIf()
s on the range of A2:A11
above to calculate the count of each value and write them to D2:D7
? I would expect the below code to work:
Sub M1ArrayCount()
Dim arrNumbers() As Variant
Dim Long1 As Long
Dim Loop1 As Long
arrNumbers() = ThisWorkbook.Sheets(1).Range("A2:A11").Value
With ThisWorkbook.Sheets(1)
For Loop1 = 1 To 6
.Cells(Loop1 + 1, 4).Value = Application.CountIf(arrNumbers(), Loop1)
Next Loop1
End With
End Sub
CountIf() Doesn't Work with Arrays
However, because Application.CountIf()
only works with ranges and not arrays, D2:D7
all show #VALUE!
errors after running the above code. A substitute must be found.