Основной вопрос
Как я могу выполнять повторяющиеся CountIf()
s в диапазоне с максимальной эффективностью (с точки зрения производительности)?
Проблемы в деталях
Диапазон до массива
Поскольку каждое чтение / запись в электронную таблицу приводит к замедлению кода VBA, рекомендуется делать это как можно реже. Обычно, если кто-то многократно читает / записывает в диапазон, он или она должны сначала сохранить этот диапазон в массив, выполнить операции с массивом, а затем, при необходимости, выполнить окончательное чтение или запись в электронную таблицу.
Примеры значений и кода
Как я могу использовать Perform CountIf()
s в диапазоне A2:A11
выше, чтобы вычислить количество каждого значения и записать их в D2:D7
? Я ожидаю, что приведенный ниже код будет работать:
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 () не работает с массивами
Однако, поскольку Application.CountIf()
работает только с диапазонами, а не с массивами, D2:D7
все показывают #VALUE!
ошибки после выполнения вышеуказанного кода. Необходимо найти замену.