Полагаю, вам действительно нужен UDF (пользовательская функция).С помощью UDF вы можете ввести формулу, которая будет выглядеть следующим образом:
в ячейке L2: =CountColorCells(B2:K2)
, и этот UDF будет возвращать количество выделенных ячеек в диапазоне.
Вот некоторые изменения, которые нужно внести в ваш код.
Во-первых, вы хотите объявить его как Function
, а не Sub
, так как нам нужно вернуть значение.
Далее, вашкод близок к тому, чтобы быть правильным, как есть.Единственная проблема заключается в том, что когда вы выполняете итерации по диапазону (который будет изменен на входной параметр функции), вам не нужно разбивать Row
и Column
.Это уже запечено в rngCell
.Итак, ваш UDF теперь выглядит так (и работает очень быстро)
Public Function CountColorCells(ByRef thisRange As Range) As Long
Dim lColorCounter As Long
Dim rngCell As Range
For Each rngCell In thisRange
If rngCell.Interior.Color = RGB(169, 208, 142) Then
lColorCounter = lColorCounter + 1
End If
Next
CountColorCells = lColorCounter
End Function
И теперь (только потому, что я не могу с этим поделать;)), вот версия UDF, которую я бы использовал.Теперь есть несколько необязательных параметров для значений красного, зеленого и синего цветов, которые вы можете добавить на тот случай, если вы хотите посчитать другой цвет.Таким образом, в этой версии UDF вы можете считать ячейки, которые являются КРАСНЫМИ, по формуле =CountColorCells(B2:K2,255,0,0)
.Это только расширенный пример того, что вы можете сделать:
Public Function CountColorCells(ByRef thisRange As Range, _
Optional ByVal r As Long = 169, _
Optional ByVal g As Long = 208, _
Optional ByVal b As Long = 142) As Long
Dim checkColor As Long
checkColor = RGB(r, g, b)
Dim lColorCounter As Long
Dim rngCell As Range
For Each rngCell In thisRange
If rngCell.Interior.Color = checkColor Then
lColorCounter = lColorCounter + 1
End If
Next
CountColorCells = lColorCounter
End Function