Как посчитать количество закрашенных ячеек в Excel: формулы, VBA и хитрости

Подсчёт ячеек с заданным цветом фона — задача, с которой регулярно сталкиваются бухгалтеры, аналитики и менеджеры проектов. На первый взгляд кажется, что в Microsoft Excel для этого должна быть стандартная функция вроде COUNTIF, но на практике всё сложнее: программа не умеет напрямую анализировать цветовое оформление. Почему так? Дело в том, что цвет ячейки — это атрибут форматирования, а не её содержимого, поэтому классические функции работы с данными его просто "не видят".

В этой статье мы разберём 5 рабочих методов, как посчитать количество закрашенных ячеек в Excel — от простых фильтров до автоматизации через VBA. Вы узнаете, какой способ быстрее для одноразовых задач, а какой подойдёт для регулярного использования в больших таблицах. Особое внимание уделим подводным камням: например, почему формула GET.CELL может возвращать ошибки в новых версиях Excel, и как этого избежать.

Спойлер: самый универсальный метод — это пользовательская функция на VBA, но для новичков мы подготовили и альтернативы без программирования. А если вам нужно не просто посчитать, но и проанализировать распределение цветов по таблице — в конце статьи есть бонусный раздел с визуализацией данных.

⚠️ Внимание: Цвет ячейки в Excel определяется индексом цвета (числом от 1 до 56), а не его визуальным оттенком. Это значит, что два визуально одинаковых цвета (например, светло-зелёный из палитры Excel 2010 и Excel 2019) могут иметь разные индексы, что повлияет на результат подсчёта.

1. Метод фильтрации: быстрый подсчёт без формул

Если вам нужно одноразово посчитать количество ячеек определённого цвета, самый простой способ — использовать встроенную функцию фильтрации по цвету. Этот метод не требует знания формул или VBA, но подходит только для статических данных (не обновляется автоматически при изменении таблицы).

Алгоритм действий:

  1. Выделите диапазон ячеек, в котором хотите посчитать цветные ячейки (например, A1:D100).
  2. Перейдите на вкладку ГлавнаяСортировка и фильтрФильтр (или нажмите Ctrl+Shift+L).
  3. Нажмите на стрелочку фильтра в заголовке столбца и выберите Фильтр по цветуФильтр по цвету ячейки.
  4. В палитре выберите нужный цвет. Excel отобразит только ячейки с этим фоном.
  5. Количество отфильтрованных строк будет показано в статусной строке внизу окна (например, "Записей: 12 из 100").

Этот способ идеален для быстрой проверки, но у него есть ограничения:

  • 🔹 Не работает с условным форматированием (фильтр не видит динамически изменяемые цвета).
  • 🔹 Не обновляется автоматически — при изменении цвета ячеек придётся повторять фильтрацию.
  • 🔹 Не подходит для подсчёта в формулах (например, если нужно использовать результат в другой ячейке).
⚠️ Внимание: Если в вашей таблице используется условное форматирование (например, ячейки закрашиваются автоматически по правилу "если значение > 100"), фильтр по цвету их не увидит. В этом случае переходите к методам с VBA или функциям GET.CELL.
📊 Как часто вам нужно считать цветные ячейки в Excel?
Один раз в месяц
Каждую неделю
Ежедневно
Редко, по необходимости

2. Функция GET.CELL: скрытые возможности Excel

Excel имеет малоизвестную функцию GET.CELL, которая может возвращать информацию о форматировании ячейки, включая её цвет. Однако использовать её напрямую нельзя — требуется обходной путь через именованный диапазон.

Инструкция по настройке:

  1. Выделите ячейку, в которой хотите получить количество цветных ячеек (например, F1).
  2. Перейдите на вкладку ФормулыДиспетчер именСоздать.
  3. В поле Имя введите ЦветЯчейки (или любое другое).
  4. В поле Формула введите:
    =GET.CELL(38,!A1)

    где 38 — это код типа информации (цвет фона), а !A1 — ссылка на первую ячейку диапазона (обязательно с восклицательным знаком!).

  5. Нажмите OK и закройте диспетчер имён.
  6. Теперь в ячейке F1 введите формулу:
    =СУММПРОИЗВ(--(ЦветЯчейки=3);--(A1:A100<>""))

    где 3 — индекс цвета (например, красный в стандартной палитре), а A1:A100 — диапазон для подсчёта.

Чтобы узнать индекс цвета вашей ячейки, используйте этот макрос (временно):

Sub ShowColorIndex()

MsgBox ActiveCell.Interior.ColorIndex

End Sub

Плюсы метода:

  • 🔹 Работает без VBA (подходит для файлов с ограниченными макросами).
  • 🔹 Обновляется автоматически при изменении цвета ячеек.

Минусы:

  • 🔸 В новых версиях Excel (2019+) GET.CELL может возвращать #N/A для некоторых цветов.
  • 🔸 Требует ручной настройки именованного диапазона.

Создать именованный диапазон|Узнать индекс цвета через VBA|Проверить работу формулы на тестовом диапазоне|Заменить 3 на нужный индекс цвета-->

3. VBA-макрос: универсальное решение для любого цвета

Если вам нужно регулярно считать цветные ячейки или работать с условным форматированием, лучший способ — создать пользовательскую функцию на VBA. Она будет работать как обычная формула и обновляться автоматически.

Инструкция по созданию функции:

  1. Нажмите Alt+F11, чтобы открыть редактор VBA.
  2. В меню выберите InsertModule.
  3. Вставьте следующий код:
    Function CountColoredCells(rng As Range, color As Range) As Long
    

    Dim cl As Range

    Dim count As Long

    count = 0

    For Each cl In rng

    If cl.Interior.Color = color.Interior.Color Then

    count = count + 1

    End If

    Next cl

    CountColoredCells = count

    End Function

  4. Закройте редактор VBA.

Теперь в любой ячейке можно использовать формулу:

=CountColoredCells(A1:A100; B1)

где A1:A100 — диапазон для подсчёта, а B1 — ячейка с образцом цвета (её фон должен совпадать с искомым).

Расширенная версия функции (учитывает условное форматирование):

Function CountColoredCellsAdvanced(rng As Range, color As Range) As Long

Dim cl As Range

Dim count As Long

count = 0

For Each cl In rng

If cl.DisplayFormat.Interior.Color = color.DisplayFormat.Interior.Color Then

count = count + 1

End If

Next cl

CountColoredCellsAdvanced = count

End Function

Критическая особенность: функция DisplayFormat работает только в Excel 2010 и новее. В старых версиях для условного форматирования потребуется другой подход.

4. Power Query: подсчёт цветов в больших таблицах

Если вы работаете с огромными массивами данных (тысячи строк), Power Query может стать спасением. Этот инструмент позволяет импортировать данные, анализировать их и выгружать обратно в Excel, включая информацию о цветах.

Пошаговая инструкция:

  1. Выделите ваш диапазон и перейдите на вкладку ДанныеИз таблицы/диапазона (или Get Data → From Table/Range).
  2. В открывшемся редакторе Power Query добавьте пользовательский столбец с формулой:
    = try if [Column1] <> null then Color.ToText([Column1]{0}[BackgroundColor]) else null otherwise null

    (замените Column1 на имя вашего столбца).

  3. Отфильтруйте новый столбец по нужному цвету (например, "FF0000" для красного).
  4. Нажмите Закрыть и загрузить, чтобы вернуть данные в Excel с подсчётом.

Преимущества Power Query:

  • 🔹 Обрабатывает миллионы строк без замедления.
  • 🔹 Можно автоматизировать обновление данных.
  • 🔹 Поддерживает условное форматирование.

Недостатки:

  • 🔸 Требует Excel 2016 или новее (в Excel 2013 нужно устанавливать надстройку).
  • 🔸 Сложнее в настройке для новичков.
Метод Подходит для условного форматирования Автоматическое обновление Сложность настройки
Фильтрация ❌ Нет ❌ Нет ⭐ Очень просто
GET.CELL ❌ Нет ✅ Да ⭐⭐ Средне
VBA ✅ Да (с DisplayFormat) ✅ Да ⭐⭐⭐ Сложно
Power Query ✅ Да ✅ Да (при обновлении) ⭐⭐⭐⭐ Очень сложно

5. Подсчёт цветов с помощью сводной таблицы

Если в вашей таблице используется ограниченное количество цветов (например, зелёный для "утверждено", красный для "отклонено"), можно автоматизировать подсчёт через сводную таблицу + VBA.

Алгоритм:

  1. Создайте вспомогательный столбец с формулой, возвращающей название цвета (например, =GetColorName(A1)).
  2. Добавьте в модуль VBA функцию:
    Function GetColorName(rng As Range) As String
    

    Select Case rng.Interior.Color

    Case RGB(255, 0, 0): GetColorName = "Красный"

    Case RGB(0, 255, 0): GetColorName = "Зелёный"

    Case RGB(0, 0, 255): GetColorName = "Синий"

    Case Else: GetColorName = "Другой"

    End Select

    End Function

  3. Создайте сводную таблицу, где в значениях будет количество, а в строках — названия цветов.

Этот метод позволяет не только считать ячейки, но и визуализировать распределение цветов по категориям. Например, вы сможете увидеть, что в вашем отчёте 30% ячеек зелёные (утверждено), 10% — красные (отклонено), а остальные — без цвета.

Как добавить новые цвета в функцию GetColorName?

Чтобы расширить функцию для других цветов, добавьте новые строки Case с RGB-кодами. Например:

Case RGB(255, 255, 0): GetColorName = "Жёлтый"

Узнать RGB-код ячейки можно через макрос:

Sub ShowRGB()

MsgBox "RGB: " & ActiveCell.Interior.Color

End Sub

6. Альтернативные решения: надстройки и Google Sheets

Если стандартные методы Excel вам не подходят, рассмотрите альтернативы:

Надстройки для Excel:

  • 🔹 Kutools for Excel — имеет встроенную функцию Count by Color, которая работает с условным форматированием.
  • 🔹 Ablebits — позволяет считать ячейки по цвету текста или фона, включая градиенты.

Google Sheets:

В Google Таблицах нет встроенной функции для подсчёта цветов, но можно использовать скрипт:

function countColoredCells(range, color) {

var sheet = SpreadsheetApp.getActiveSheet();

var bgColor = sheet.getRange(color).getBackground();

var data = sheet.getRange(range).getBackgrounds();

var count = 0;

for (var i = 0; i < data.length; i++) {

for (var j = 0; j < data[0].length; j++) {

if (data[i][j] === bgColor) count++;

}

}

return count;

}

Используйте в ячейке как =countColoredCells("A1:B10"; "C1").

Когда стоит использовать альтернативы:

  • 🔹 Вам нужно считать градиенты или узоры (стандартные методы Excel их не видят).
  • 🔹 Вы работаете в корпоративной среде, где запрещены макросы.
  • 🔹 Нужна кроссплатформенность (например, совместная работа в Excel и Google Sheets).

FAQ: Частые вопросы по подсчёту цветных ячеек

Можно ли посчитать ячейки с условным форматированием без VBA?

Да, но с оговорками. Функция GET.CELL не видит условное форматирование, поэтому единственные рабочие способы без VBA:

  1. Преобразовать условное форматирование в статический цвет (копировать → специальная вставка → Значения и форматы).
  2. Использовать Power Query (поддерживает DisplayFormat).

В остальных случаях потребуется VBA с DisplayFormat.Interior.Color.

Почему моя функция CountColoredCells возвращает 0, хотя цветные ячейки есть?

Вероятные причины:

  • 🔹 Цвет в образце (B1) не совпадает по RGB-коду с искомыми ячейками (например, визуально одинаковые оттенки серого могут иметь разные значения).
  • 🔹 Ячейки окрашены через условное форматирование, а вы используете Interior.Color вместо DisplayFormat.Interior.Color.
  • 🔹 В настройках Excel отключены макросы (проверьте Файл → Параметры → Центр управления безопасностью).

Решение: добавьте в функцию отладочный вывод:

Debug.Print "Искомый цвет: " & color.Interior.Color & ", Текущий цвет: " & cl.Interior.Color

Как посчитать ячейки с полупрозрачным цветом или градиентом?

Стандартные методы Excel (включая VBA) не умеют анализировать градиенты или прозрачность. Альтернативы:

  • 🔹 Используйте надстройки вроде Ablebits (поддерживают сложные форматы).
  • 🔹 Преобразуйте градиент в сплошной цвет через Формат ячеек → Заливка → Сплошная заливка.
  • 🔹 Для Google Sheets напишите скрипт, который проверяет getBackgrounds() на наличие градиентных стилей.
Можно ли посчитать цветные ячейки в защищённом листе?

Да, но с ограничениями:

  • 🔹 Фильтрация и GET.CELL будут работать.
  • 🔹 VBA потребует временного снятия защиты (или прав на редактирование макросов).
  • 🔹 Power Query работает независимо от защиты листа.

Если у вас нет прав на снятие защиты, попросите администратора добавить ваш макрос в список доверенных.

Как экспортировать список цветов из Excel для анализа?

Чтобы получить список всех используемых цветов в таблице:

  1. Используйте этот макрос:
    Sub ListAllColors()
    

    Dim rng As Range, cl As Range

    Dim dict As Object

    Set dict = CreateObject("Scripting.Dictionary")

    Set rng = Selection

    For Each cl In rng

    If Not dict.exists(cl.Interior.Color) Then

    dict.Add cl.Interior.Color, "RGB: " & cl.Interior.Color & " | Ячейка: " & cl.Address

    End If

    Next cl

    Sheets.Add

    Dim i As Long

    For i = 0 To dict.Count - 1

    Cells(i + 1, 1).Value = dict.items(i)

    Cells(i + 1, 1).Interior.Color = dict.keys(i)

    Next i

    End Sub

  2. Выделите диапазон и запустите макрос. Он создаст новый лист со списком уникальных цветов и их RGB-кодами.