Как написать макрос, который будет проходить по диапазону ячеек и подсчитывать их содержимое по цвету, не подсчитывая при этом каждую отдельную ячейку в группе объединенных ячеек?
Например, на рисунке я хочу, чтобы макрос возвращал количество 2 желтых и 3 зеленых, но написанный мной макрос возвращает количество 8 желтых, поскольку он считает 7 объединенных желтых ячеек как отдельные...
решение1
Уф. В этом примере есть две плохие практики, которых следует избегать: цветовое кодирование ячеек для передачи смысла и объединение ячеек. Не надо. Просто не надо. Используйте другой столбец для определения значения статуса или категории, затем вы можете использовать условное форматирование, чтобы задать цвет ячейки на основе этого значения статуса или категории. И вы можете использовать простые формулы рабочего листа для выполнения подсчета по статусу или категории.
Объединение ячеек вызывает больше головной боли, чем аспирин. Просто не объединяйте ячейки. Они вызывают проблемы с выбором и, как вы заметили, с логикой в VBA. Не объединяйте, а сделайте простой подсчет с помощью формул рабочего листа. «Необходимость» в объединении ячеек всегда можно преодолеть с помощью правильной архитектуры данных и структуры рабочего листа.
решение2
Я полностью согласен с@тейлинпредупреждение, но если есть какие-то очень обоснованные причины для такого решения, то можно воспользоваться такой функцией, например.
Function ColorCount(rng As Range, pat) As Long
Dim cell As Range, cnt As Long
Select Case TypeName(pat)
Case "Range": pat = pat.Interior.Color
Case "String": pat = Range(pat).Interior.Color
End Select
For Each cell In rng
If cell.Address = cell.MergeArea(1).Address And _
cell.Interior.Color = pat Then
cnt = cnt + 1
End If
Next cell
ColorCount = cnt
End Function
Функция принимает два аргумента: первый — диапазон проверяемых ячеек, второй — цветовой шаблон (это может быть ссылка, текст адреса или числовое значение цвета). Цвет ячейки из базового форматирования, не условный.