Skip to content
В этой статье вы узнаете, как посчитать ячейки по цвету и получить сумму по цвету ячеек в Excel. Эти решения работают как для окрашенных вручную, так и с условным форматированием.
Если вы активно используете различные цвета заливки и шрифта на листах Excel, чтобы различать различные типы значений, вам может потребоваться узнать, сколько ячеек выделено определенным цветом. Если значения ваших ячеек являются числами, вы можете автоматически вычислить сумму ячеек, закрашенных одним цветом, например, сумму всех красных ячеек.
Как все мы знаем, Microsoft Excel предоставляет множество формул для разных целей, и было бы логично предположить, что для подсчета ячеек по цвету есть и такие. Но, к сожалению, нет стандартной функции, которая позволяла бы суммировать по цветам или считать по цветам в Excel.
Помимо использования сторонних надстроек, есть только одно возможное решение — использование пользовательских функций. Если вы очень мало знаете об этой технологии или никогда раньше не слышали этот термин, не пугайтесь, вам не придется писать код самостоятельно. Здесь вы найдете готовое решение, и все, что вам нужно сделать, это скопировать / вставить его в свою книгу.
Функции и макросы, которые мы рассмотрим в этой статье, помогут нам сделать следующее:
- Как посчитать по цвету и суммировать по цвету на листе Excel
- Как суммировать по цвету и сосчитать по цвету во всей рабочей книге
- Пользовательские функции для получения цвета ячейки, цвета шрифта и цветового кода
- Как считать по цвету и суммировать ячейки, окрашенные с использованием условного форматирования
- Самый быстрый способ подсчета и суммирования ячеек по цвету в Excel
Как посчитать по цвету и суммировать по цвету на листе Excel
Предположим, у вас есть таблица со списком заказов, в которой ячейки в столбце «Количество» окрашены в зависимости от их значения в колонке «Выполнение» и даты: ячейки с выполняемыми заказами сроком до 30 дней от текущей даты — желтые, уже выполненные — зеленые, а просроченные заказы — красные.
Теперь нам нужно автоматически подсчитать ячейки определенного цвета, т.е. посчитать количество красных, зеленых и желтых ячеек в таблице. Как я объяснил выше, прямого решения этой задачи при помощи стандартных формул Excel не существует. Но, к счастью, есть код VBA для Excel. Выполните 5 быстрых шагов ниже, и вы узнаете число и сумму ваших цветных ячеек всего за несколько минут.
- Откройте книгу Excel и нажмите
Alt+F11
, чтобы открыть редактор Visual Basic (VBE). - Щелкните правой кнопкой мыши имя своей книги в разделе «Project–VBAProject» в правой части экрана, а затем выберите «Вставить» > «Модуль» в контекстном меню.
- Добавьте в вашу рабочую книгу следующий код:
Function GetCellColor(xlRange As Range)
Dim indRow, indColumn As Long
Dim arResults()
Dim colorVal As Variant
Application.Volatile
If xlRange Is Nothing Then
Set xlRange = Application.ThisCell
End If
If xlRange.Count > 1 Then
ReDim arResults(1 To xlRange.Rows.Count, 1 To xlRange.Columns.Count)
For indRow = 1 To xlRange.Rows.Count
For indColumn = 1 To xlRange.Columns.Count
colorVal = xlRange(indRow, indColumn).Interior.Color
arResults(indRow, indColumn) = (colorVal Mod 256) & ", " & ((colorVal 256) Mod 256) & ", " & (colorVal 65536)
Next
Next
GetCellColor = arResults
Else
colorVal = xlRange.Cells(1, 1).Interior.Color
GetCellColor = (colorVal Mod 256) & ", " & ((colorVal 256) Mod 256) & ", " & (colorVal 65536)
End If
End Function
Function GetCellFontColor(xlRange As Range)
Dim indRow, indColumn As Long
Dim arResults()
Dim colorVal As Variant
Application.Volatile
If xlRange Is Nothing Then
Set xlRange = Application.ThisCell
End If
If xlRange.Count > 1 Then
ReDim arResults(1 To xlRange.Rows.Count, 1 To xlRange.Columns.Count)
For indRow = 1 To xlRange.Rows.Count
For indColumn = 1 To xlRange.Columns.Count
colorVal = xlRange(indRow, indColumn).Font.Color
arResults(indRow, indColumn) = (colorVal Mod 256) & ", " & ((colorVal 256) Mod 256) & ", " & (colorVal 65536)
Next
Next
GetCellFontColor = arResults
Else
colorVal = xlRange.Cells(1, 1).Font.Color
GetCellFontColor = (colorVal Mod 256) & ", " & ((colorVal 256) Mod 256) & ", " & (colorVal 65536)
End If
End Function
Function CountCellsByColor(rData As Range, cellRefColor As Range) As Long
Dim indRefColor As Long
Dim cellCurrent As Range
Dim cntRes As Long
Application.Volatile
cntRes = 0
indRefColor = cellRefColor.Cells(1, 1).Interior.Color
For Each cellCurrent In rData
If indRefColor = cellCurrent.Interior.Color Then
cntRes = cntRes + 1
End If
Next cellCurrent
CountCellsByColor = cntRes
End Function
Function SumCellsByColor(rData As Range, cellRefColor As Range)
Dim indRefColor As Long
Dim cellCurrent As Range
Dim sumRes
Application.Volatile
sumRes = 0
indRefColor = cellRefColor.Cells(1, 1).Interior.Color
For Each cellCurrent In rData
If indRefColor = cellCurrent.Interior.Color Then
sumRes = WorksheetFunction.Sum(cellCurrent, sumRes)
End If
Next cellCurrent
SumCellsByColor = sumRes
End Function
Function CountCellsByFontColor(rData As Range, cellRefColor As Range) As Long
Dim indRefColor As Long
Dim cellCurrent As Range
Dim cntRes As Long
Application.Volatile
cntRes = 0
indRefColor = cellRefColor.Cells(1, 1).Font.Color
For Each cellCurrent In rData
If indRefColor = cellCurrent.Font.Color Then
cntRes = cntRes + 1
End If
Next cellCurrent
CountCellsByFontColor = cntRes
End Function
Function SumCellsByFontColor(rData As Range, cellRefColor As Range)
Dim indRefColor As Long
Dim cellCurrent As Range
Dim sumRes
Application.Volatile
sumRes = 0
indRefColor = cellRefColor.Cells(1, 1).Font.Color
For Each cellCurrent In rData
If indRefColor = cellCurrent.Font.Color Then
sumRes = WorksheetFunction.Sum(cellCurrent, sumRes)
End If
Next cellCurrent
SumCellsByFontColor = sumRes
End Function
- Сохраните свою книгу как «Книга Excel с поддержкой макросов (.xlsm)».
Если вы новичок и вам сложно работать с VBA, вы можете найти подробные пошаговые инструкции и несколько полезных советов в этом руководстве: Как вставить и запустить код VBA в Excel .
- Теперь, когда вся подготовительная работа сделана, выберите ячейку, в которой вы хотите получить результат, и введите в нее только что записанную нами пользовательскую функцию CountCellsByColor:
CountCellsByColor( диапазон ; код цвета )
здесь и далее эти аргументы означают:
диапазон – диапазон ячеек, в которых вы хотите произвести подсчеты по цвету,
код цвета – адрес ячейки-образца, цвет фона или шрифта которой соответствуют искомому цвету фона или шрифта.
В этом примере мы используем формулу, =CountCellsByColor(D2:D21;A24), где D2:D21— это диапазон, в котором вы хотите посчитать количество ячеек с цветом, а A24 — это ячейка, закрашенная нужным нам цветом, красным в нашем случае.
Аналогичным образом вы записываете формулы для других цветов, которые хотите посчитать, желтого и зеленого, в нашей таблице.
Если у вас есть числовые данные в цветных ячейках (например, столбец Количество в нашей таблице), вы можете сложить значения на основе определенного цвета, используя аналогичную функцию SumCellsByColor:
SumCellsByColor( диапазон ; код цвета)
Как показано на скриншоте выше, мы использовали формулу суммы по цвету, =SumCellsByColor(D2:D21;A24), где D2:D21 — это диапазон, а A24 — ячейка с образцом цвета.
Аналогичным образом вы можете посчитать выделенные цветом ячейки и суммировать значения таких ячеек по цвету шрифта, используя функции CountCellsByFontColor и SumCellsByFontColor соответственно.
На скриншоте ниже вы видите, как можно подсчитать количество значений, написанных красным цветом.
=CountCellsByFontColor(D2:D21;A24)
Аналогично подсчитываем сумму чисел, имеющих определённый цвет шрифта, при помощи формулы:
=SumCellsByFontColor(D2:D21;A24)
Примечание. Если после применения вышеупомянутого кода VBA вам потребуется раскрасить еще несколько ячеек вручную, то сумма и количество окрашенных ячеек не будут пересчитаны автоматически, чтобы отразить произошедшие изменения. Пожалуйста, не сердитесь на нас, это не ошибка кода
На самом деле, это нормальное поведение всех макросов Excel, скриптов VBA и пользовательских функций. Дело в том, что все подобные функции вызываются только при изменении данных рабочего листа. Но Excel не воспринимает изменение цвета шрифта или цвета ячейки как изменение данных.
Итак, после раскрашивания ячеек вручную, просто поместите курсор в любую ячейку и нажмите F2
, а затем Enter
. То есть, сделайте вид, что меняете содержимое какой-либо ячейки. Сумма и количество в пользовательской функции тут же будут обновлены. То же самое относится и к другим макросам, которые считают по цвету.
Как суммировать по цвету и сосчитать по цвету во всей рабочей книге
Приведенная ниже пользовательская функция подсчитывает и находит сумму ячеек по цвету заливки на всех листах рабочей книги. Итак, вот ее код:
Function WbkCountCellsByColor(cellRefColor As Range)
Dim vWbkRes
Dim wshCurrent As Worksheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
vWbkRes = 0
For Each wshCurrent In Worksheets
wshCurrent.Activate
vWbkRes = vWbkRes + CountCellsByColor(wshCurrent.UsedRange, cellRefColor)
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
WbkCountCellsByColor = vWbkRes
End Function
Function WbkSumCellsByColor(cellRefColor As Range)
Dim vWbkRes
Dim wshCurrent As Worksheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
vWbkRes = 0
For Each wshCurrent In Worksheets
wshCurrent.Activate
vWbkRes = vWbkRes + SumCellsByColor(wshCurrent.UsedRange, cellRefColor)
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
WbkSumCellsByColor = vWbkRes
End Function
Вы используете этот макрос так же, как и предыдущий код, и выводите количество и сумму цветных ячеек с помощью следующих формул =WbkCountCellsByColor() и =WbkSumCellsByColor() соответственно.
Единственный аргумент, который нужен этим функциям, это адрес ячейки с нужным цветом.
Просто введите любую из этих формул в любую пустую ячейку на любом листе без указания диапазона, используйте в скобках адрес ячейки нужного цвета, например
=WbkSumCellsByColor(A1)
Формула отобразит сумму всех ячеек, закрашенных тем же цветом, на всех листах в вашей рабочей книге.
Пользовательские функции для получения цвета ячейки, цвета шрифта и цветового кода
Здесь вы найдете перечень всех функций, которые мы использовали ранее, а также несколько новых, которые извлекают цветовые коды.
Зачем они нам? Но ведь если ваша таблица окрашена не совсем стандартными цветами (например, светло-зеленым), то подобрать образец цвета для функций, которые мы рассматривали выше, будет весьма затруднительно. Если же у вас будет код нужного цвета, вы сможете использовать его при форматировании ячейки-образца, чтобы получить точное соответствие цвета.
Если вы вдруг забыли, как можно вручную раскрасить ячейку в нужный цвет, то напомню. Жмем Ctrl+1
, затем Заливка – Другие цвета – Спектр – RGB формат. Вот туда и вставляем полученный код. Точное соответствие цвета будет обеспечено.
Примечание. Помните, что все эти формулы будут работать только в том случае, если вы добавили пользовательскую функцию в книгу Excel, как показано ранее в этой статье.
Функции для подсчета по цвету:
- CountCellsByColor(диапазон; код цвета) – считает ячейки с заданным цветом фона.
В приведенном выше примере мы использовали следующую формулу для подсчета ячеек по цвету
= CountCellsByColor (F2: F14, A17)
где F2: F14 — выбранный диапазон, а A17 — ячейка с нужным цветом фона. Вы можете использовать все остальные формулы, перечисленные ниже, аналогичным образом.
- CountCellsByFontColor(диапазон; код цвета) – подсчитывает ячейки с указанным цветом шрифта.
Формулы для суммирования по цветам:
- SumCellsByColor(диапазон; код цвета) – вычисляет сумму ячеек с определенным цветом фона.
- SumCellsByFontColor(диапазон; код цвета) – вычисляет сумму ячеек с определенным цветом шрифта.
Функции для получения кода цвета ячейки:
- GetCellFontColor(ячейка) – возвращает цветовой код цвета шрифта указанной ячейки.
- GetCellColor(ячейка) – возвращает цветовой код цвета фона указанной ячейки.
Вот примеры использования функции цвета ячейки:
А на этим скриншоте мы получаем цветовой RGB код шрифта.
Как считать по цвету и суммировать ячейки, окрашенные с использованием условного форматирования
Если вы применили условное форматирование к ячейкам на основе их значений и теперь хотите посчитать эти ячейки по цвету или просуммировать значения в закрашенных ячейках, то у меня плохие новости — не существует универсальной определяемой пользователем функции, которая бы суммировала по цвету или пересчитала закрашенные условным форматированием ячейки и вывела бы полученные числа прямо в указанные клетки таблицы. По крайней мере мне о такой функции не известно, увы
Конечно, вы можете найти в Интернете тонны кода VBA, который пытается это сделать, но все эти коды (по крайней мере, примеры, с которыми я сталкивался), не обрабатывают условное форматирование, такое как «Форматировать все ячейки на основе их значений», «Форматировать только наибольшие или наименьшие значения», «Форматировать только значения выше или ниже среднего», «Форматировать только уникальные или повторяющиеся значения». Кроме того, почти все эти коды VBA имеют ряд особенностей и ограничений, из-за которых они могут работать некорректно с определенными книгами или типами данных. В общем, вы можете испытать удачу и поискать в Google идеальное решение, и если вы его найдете, пожалуйста, вернитесь и опубликуйте свое открытие здесь!
Но если пользовательская функция не может выполнить эту задачу, то макрос VBA вполне может справиться. О различиях пользовательских функций и макросов VBA вы можете более подробно прочитать в этой статье.
Приведенный ниже макрос VBA преодолевает вышеупомянутые ограничения и работает в электронных таблицах Microsoft Excel со всеми типами условного форматирования. Он отображает количество выделенных определенным цветом ячеек и сумму значений в этих ячейках, независимо от того, какой тип условного форматирования используется на листе.
Sub SumCountByConditionalFormat()
Dim indRefColor As Long
Dim cellCurrent As Object
Dim cntRes As Long
Dim sumRes
Dim cntCells As Long
Dim indCurCell As Long
cntRes = 0
sumRes = 0
Set cellCurrent = Selection
adr = Mid(cellCurrent.Address, InStr(cellCurrent.Address, ",") + 1, 20)
adr1 = Left(adr, 4)
adr2 = Left(cellCurrent.Address, InStr(cellCurrent.Address, ",") - 1)
Range(adr2).Activate
indRefColor = ActiveCell.DisplayFormat.Interior.Color
Range(adr).Activate
cntCells = Selection.CountLarge
Range(adr).Select
Range(adr).Activate
Set cellCurrent = Selection
For indCurCell = 1 To (cntCells - 1)
If indRefColor = cellCurrent(indCurCell).DisplayFormat.Interior.Color Then
cntRes = cntRes + 1
sumRes = WorksheetFunction.Sum(cellCurrent(indCurCell), sumRes)
End If
Next
MsgBox "Count=" & cntRes & vbCrLf & "Sum= " & sumRes & vbCrLf & vbCrLf & _
"Color=" & Left("000000", 6 - Len(Hex(indRefColor))) & _
Hex(indRefColor) & vbCrLf, , "Count & Sum by Conditional Format color"
End Sub
Как использовать этот макрос для подсчета цветных ячеек и суммирования их значений.
Опишем процесс пошагово:
- Добавьте приведенный выше код на лист, как описано в первом параграфе статьи .
- Выберите ячейку с нужным цветом.
- Нажмите и удерживайте
Ctrl
. - Выберите диапазон, в котором вы хотите подсчитать цветные ячейки и/или суммировать по цвету, если у вас есть числовые данные.
- Отпустите клавишу
Ctrl
. - НажНажмите комбинацию
Alt+F8
, чтобы открыть список макросов в вашей книге. - Выберите макрос SumCountByConditionalFormat и нажмите «Выполнить» .
Покажем эти действия на скриншотах. Используем пример данных, с которыми мы уже работали в первых параграфах этой статьи. Только теперь они окрашены в столбце В при помощи условного форматирования.
Сначала выбираем ячейку D5, поскольку хотим подсчитать ячейки красного цвета с просроченными заказами.
Затем дополнительно, удерживая Ctrl
, выделяем диапазон ячеек в столбце D, по которым нужно выполнить подсчет ячеек определенного цвета.
Выполняем макрос, как показано на скриншоте ниже.
В результате вы увидите следующее сообщение с результатами:
Для этого примера мы выбрали столбец «Количество» и получили следующие цифры:
- Count — это количество ячеек определенного цвета, красного в нашем случае, который отмечает ячейки «Просрочен».
- Sum — это сумма значений всех красных ячеек в выбранной колонке, т.е. общее количество «Просроченных» заказов.
- Color — это шестнадцатеричный код цвета выбранной ячейки, в нашем случае D5.
Таким образом мы можем посчитать сумму и количество по цвету ячеек с условным форматированием.
Самый быстрый способ подсчета и суммирования ячеек по цвету в Excel
Я могу рекомендовать вам надстройку для Excel, которая бы считала и суммировала ячейки по указанному вами цвету или по всем цветам в выбранном диапазоне.
При этом не имеет значения, как установлены эти цвета – прямым форматированием ячейки либо при помощи условного форматирования.
Позвольте представить вам наш совершенно новый инструмент — «Счет и сумма по цвету» для Excel. Он имеет два варианта подсчета — «Один цвет» и «Все цвета», как видно на скриншоте ниже.
Подсчет и суммирование по одному цвету.
Вы нажимаете кнопку « Один цвет » на ленте, и в левой части рабочего листа открывается панель « Подсчет и сумма по цвету» . На панели вы выбираете:
- Диапазон, в котором вы хотите подсчитать и суммировать ячейки
- Любую ячейку с нужным цветом как образец
- Вариант — цвет фона или шрифта
После этого нажмите « Рассчитать » и сразу же увидите результат в нижней части панели! Помимо подсчета и суммы, надстройка вычисляет среднее значение и находит максимальное и минимальное значения. Никаких макросов, никаких формул, никакой боли
Обратите внимание, что подсчет возможен как по цвету фона, так и по цвету шрифта.
Подсчет и суммирование ячеек по всем цветам в выбранном диапазоне
Опция «Все цвета» работает в основном так же, за исключением того, что вам не нужно выбирать цвет. В разделе «Result for ..» вы можете выбрать любой из параметров: Количество, Сумма, Среднее, Максимальное или Минимальное значение и другие.
Если вы хотите скопировать результаты на свой рабочий лист, нажмите кнопку «Paste All…» в нижней части панели .
В настоящее время надстройка доступна как часть Ultimate Suite for Excel . Это коллекция отличных инструментов, специально разработанных для решения самых утомительных, кропотливых и подверженных ошибкам задач в Excel.
В дополнение к надстройке «Подсчет и суммирование по цвету», Ultimate Suite включает более 70 инструментов, которые помогут вам объединить данные из разных листов, удалить дубликаты, сравнить листы на совпадения и различия и многое другое.
Надеюсь, теперь сумма по цвету и подсчет ячеек по цвету для вас не будут сложными. Если же будут вопросы – не стесняйтесь задавать их в комментариях.
Мы с вами уже рассматривали вопрос о том как посчитать в Excel количество ячеек/значений в подробном видео уроке. Сегодня мы бы хотели немного расширить данную статью для решения более узкой задачи. Допустим, вам необходимо посчитать количество ячеек в зависимости от цвета ячеек или цвета текста.
Начиная с Excel 2007 в программе встроили возможность сортировки ячеек по цвету. Таким образом, можно отфильтровать нужный нам цвет, выделить оставшиеся на виду ячейки и визуально посмотреть общее количество ячеек. Но что делать, если нам требуется делать это часто и при этом нам необходимо, чтобы все считалось и пересчитывалось с помощью формул.
Для этих целей необходимо использовать очень простенький макрос, а точнее пользовательскую функцию, назовем ее ColorNom, она позволит нам вытягивать числовой код цвета заливки и далее по этому коду мы и будет считать общее количество ячеек, используя приемы, описываемые в статье как посчитать в Excel количество ячеек/значений
Итак, приступим. Зайдите в редактор Visual Basic, для этого:
в Excel 2003 нажмите на Сервис, далее Макрос и затем Редактор Visual Basic.
в Excel 2007, 2010 и 2013 это делается по-другому. Зайдите в раздел Разработчик, далее выберите Visual Basic
Внимание! Раздел панели инструментов Разработчик в Excel 2007 доступен по умолчанию, а в Excel 2010 и 2013 его необходимо включить. Это особенно полезно сделать тем пользователям, которые будут часто работать с макросами. Чтобы включить панель инструментов Разработчик в Excel 2010 или 2013 необходимо запустить Файл | Параметры | Настройка ленты после этого необходимо с правой стороны необходимо поставить галочку напротив надписи Разработчик
После того как откроется редактор Visual Basic, вставьте пустой модуль, для этого выберите меню Insert и далее Module
и скопируйте туда текст простой функции:
Public Function ColorNom(Cell As Range)
ColorNom = Cell.Interior.ColorIndex
End Function
После этого закройте редактор Visual Basic и можно вернуться к нашему файлу. В любой пустой ячейки введите пользовательскую функцию, которую мы ввели раннее. В нашем случае это функция ColorNom, ее можно вызвать либо через меню Вставка, Функция — категория Определенные пользователем, либо просто можно напечатать ее в самой ячейке =ColorNom(A1), где A1 — это наша ячейка, в которой нам необходимо определить индекс цвета.
После этого уже не составит труда посчитать количество ячеек или значений в зависимости от цвета ячейки. Используйте нашу статью как посчитать в Excel количество ячеек/значений
Если вам необходимо посчитать количество значений или сумму в зависимости от цвета текста, то необходимо немного изменить код пользовательской функции.
Public Function ColorNom(Cell As Range)
ColorNom = Cell.Font.ColorIndex
End Function
Важно! Вы не сможете находить с помощью данной функции номер цвета ячейки при использовании условного форматирования. Кроме того, при изменении цвета ячейки Excel не пересчитывает значения, необходимо это делать в ручную, нажимая Ctrl+Alt+F9, либо изменения будут происходить при новом открытии данного файла. Это происходит из-за того, что Excel не считает изменение цвета ячейки редактированием формулы. В связи с этим, если это критично, то можно внести изменение в саму формулу, просто добавив функцию, которая постоянно пересчитывается и при этом не повлияет на определение цвета ячейки. Например, указать функцию определения текущей даты, умноженную на ноль.
В нашем случае функция будет выглядеть следующем образом.
=ColorNom(A1)+Сегодня()*0
Пример подсчета количества значений по цвету цвету заливки ячеек в Excel
Рассмотрим вышеуказанный пример с перечнем фруктов. Мы определили код ячеек и отобразили его напротив каждой ячейки.
Далее для удобства мы создадим вспомогательную таблицу из всех существующих цветов заливки. В нашем случае это красный, зеленый и желтый. Рядом с помощью все той же формулы определим код цвета.
В третьем столбце мы уже будет считать количество ячеек определенного цвета по условию, использую код цвета.
Считать количество мы будем с помощью функции СЧЁТЕСЛИ
Вот так выглядят аргументы данной функции
=СЧЁТЕСЛИ(диапазон;критерий)
Пропишем формулу:
=СЧЁТЕСЛИ($B$1:$B$8;E2)
Диапазон мы указали со знаком доллара, чтобы он был закреплен и можно было протянуть формулу. Критерия у нас встречается всего три и они указаны в нашей вспомогательной таблице. Протянем формулу и получим количество ячеек по цветам.
Скачать пример файла: Цвет_Ячеек.xlsm (файл с поддержкой макросов)
Вычисления по цвету ячеек
Помечать ячейки цветом, используя заливку или цвет шрифта, очень удобно и наглядно. Если вы не дальтоник, конечно Трудности возникают тогда, когда по такой раскрашенной таблице возникает необходимость сделать отчет. И если фильтровать и сортировать по цвету Excel в последних версиях научился, то суммировать по цвету до сих пор не умеет.
Чтобы исправить этот существенный недостаток можно использовать несложные пользовательские макрофункции на Visual Basic, которые позволят нам суммировать/подсчитывать количество/среднее арифметическое ячеек с определенным цветом заливки/шрифта.
На вкладке Разработчик (Developer) нажмите кнопку Visual Basic или сочетание клавиш Alt+F11, чтобы открыть редактор макросов. Если такой вкладки у вас не видно, то включите ее в настройках Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon).
В окне редактора вставьте новый модуль через меню Insert — Module и скопируйте туда текст следующих функций:
Function CountByColor(DataRange As Range, ColorSample As Range) As Long Dim cell As Range, n As Long For Each cell In DataRange If cell.Interior.Color = ColorSample.Interior.Color Then n = n + 1 Next cell CountByColor = n End Function Function SumByColor(DataRange As Range, ColorSample As Range) As Double Dim cell As Range, total As Double For Each cell In DataRange If IsNumeric(cell) And cell.Interior.Color = ColorSample.Interior.Color Then total = total + cell.Value Next cell SumByColor = total End Function Function AverageByColor(DataRange As Range, ColorSample As Range) As Double Dim cell As Range, total As Double, n As Long For Each cell In DataRange If IsNumeric(cell) And cell.Interior.Color = ColorSample.Interior.Color Then total = total + cell.Value n = n + 1 End If Next cell AverageByColor = total / n End Function
Как легко сообразить, первая функция здесь вычисляет количество ячеек с заданным цветом заливки, вторая — сумму, а третья — среднее арифметическое. У всех функций два аргумента:
- DataRange — диапазон исходных ячеек с числами, раскрашенных в разные цвета
- ColorSample — ячейка, цвет заливки которой мы берём за образец
Если теперь вернуться в Excel, то в Мастере функций (вкладка Формулы — кнопка Вставить функцию) в появившейся там категории Определенные пользователем (User Defined) можно найти наши функции и вставить их на лист. Либо напрямую ввести их в строку формул, как любые другие функции Excel:
Добавление условий
Аналогичный подход можно легко масштабировать, добавляя, при необходимости, дополнительные условия в проверку (команда if … then…). Так, например, если нам нужно при вычислении среднего арифметического учитывать не только цвет заливки, но и цвет шрифта (т.е. считать не просто жёлтые, а именно жёлто-красные ячейки), то код нашей макро-функции будет выглядеть так:
Function AverageByColor2(DataRange As Range, ColorSample As Range) As Double Dim cell As Range, total As Double, n As Long For Each cell In DataRange If IsNumeric(cell) And cell.Interior.Color = ColorSample.Interior.Color And cell.Font.Color = ColorSample.Font.Color Then total = total + cell.Value n = n + 1 End If Next cell AverageByColor2 = total / n End Function
Разница только в добавленном через логическую связку «И» (and) условии на проверку соответствия цвета шрифта очередной проверяемой ячейки cell.Font.Color цвету шрифта ячейки-образца ColorSample.Font.Color.
Ограничения и нюансы пересчёта
У созданных нами макрофункций есть 2 важных нюанса.
Во-первых, эти функции «не видят» заливку, созданную с помощью условного форматирования, т.е. работают только с цветом, который был задан для ячеек вручную.
Во-вторых, к сожалению, изменение цвета заливки или цвета шрифта ячейки Excel не считает изменением её содержимого, поэтому не запускает пересчет формул. То есть при перекрашивании исходных ячеек с числами в другие цвета итоговая сумма/среднее/количество по нашим функциям автоматически пересчитываться пересчитываться не будет.
Полностью решить эту проблему невозможно, но есть несколько способов её обойти:
- Сделать двойной щелчок левой кнопкой мыши по ячейки с нашей формулой и нажать на Enter, т.е. имитировать повторный ввод функции в ячейку — Excel её заново пересчитает и выдаст обновленный результат.
- Можно использовать сочетание клавиш Ctrl+Alt+F9, которое принудительно заставит Excel пересчитать всё формулы и функции независимо от того, изменились ли для них исходные данные. Но это сочетание нужно будет не забывать нажимать каждый раз при изменении исходных данных.
- Добавить в код наших макрофункций (в любое место) команду Application.Volatile True. Эта команда языка Visual Basic заставляет Excel пересчитывать результаты нашей функции при изменении любой ячейки на листе (или по нажатию F9). Однако, в этом случае, скорость работы наших функций заметно снизится, т.к. их пересчёт будет происходить постоянно — даже когда мы не меняли цвета или значения ячеек в исходных данных. Пользуйтесь этим методом осторожно.
И помните о том, что наша функция перебирает все (и пустые тоже) ячейки в диапазоне DataRange и не задавайте в качестве первого аргумента целый столбец — «думать» будет долго
Ссылки по теме
- Сортировка строк по цвету
- Функции подсчета количества и суммы ячеек по цвету из надстройки PLEX
- Что такое «ад условного форматирования» и как его победить
Просуммируем значения ячеек в зависимости от цвета их заливки. Здесь же покажем, как подсчитать такие ячейки.
Функции для суммирования значений по цвету ячеек в EXCEL не существует (по крайней мере, в EXCEL 2016 и в более ранних версиях). Вероятно, подавляющему большинству пользователей это не требуется.
Пусть дан диапазон ячеек в столбце А. Пользователь выделил цветом ячейки, чтобы разбить значения по группам.
Необходимо сложить значения ячеек в зависимости от цвета фона. Основная задача: Как нам «объяснить» функции сложения, что нужно складывать значения, например, только зеленых ячеек?
Это можно сделать разными способами, приведем 3 из них: с помощью
Автофильтра
, Макрофункции ПОЛУЧИТЬ.ЯЧЕЙКУ() и VBA.
С помощью Автофильтра (ручной метод)
-
Добавьте справа еще один столбец с заголовком
Код цвета
. -
Выделите заголовки и нажмите CTRL+SHIFT+L, т.е. вызовите
Автофильтр
(подробнее здесь
)
-
Вызовите меню
Автофильтра
, выберите зеленый цвет
- Будут отображены только строки с зелеными ячейками
- Введите напротив каждого «зеленого» значения число 1
- Сделайте тоже для всех цветов
Введите формулу
=СУММЕСЛИ(B7:B17;E7;A7:A17)
как показано в
файле примера (лист Фильтр)
.
Для
подсчета значений
используйте функцию
СЧЕТЕСЛИ()
.
С помощью Макрофункции ПОЛУЧИТЬ.ЯЧЕЙКУ()
Сразу предупрежу, что начинающему пользователю EXCEL будет сложно разобраться с этим и следующим разделом.
Идея заключается в том, чтобы автоматически вывести в соседнем столбце числовой код фона ячейки (в MS EXCEL все цвета имеют соответствующий числовой код). Для этого нам потребуется функция, которая может вернуть этот код. Ни одна обычная функция этого не умеет. Используем макрофункцию ПОЛУЧИТЬ.ЯЧЕЙКУ(), которая возвращает код цвета заливки ячейки (она может много, но нам потребуется только это ее свойство).
Примечание:
Макрофункции — это набор функций к EXCEL 4-й версии, которые нельзя напрямую использовать на листе EXCEL современных версий, а можно использовать только в качестве
Именованной формулы
. Макрофункции — промежуточный вариант между обычными функциями и функциями VBA. Для работы с этими функциями требуется сохранить файл в формате с макросами *.xlsm
-
Сделайте активной ячейку
В7
(это важно, т.к. мы будем использоватьотносительную адресацию
в формуле)
-
В
Диспетчере имен
введите формулу =ПОЛУЧИТЬ.ЯЧЕЙКУ(63;Макрофункция!A7)
- Назовите ее Цвет
- Закройте Диспетчер имен
-
Введите в ячейку
В7
формулу =Цвет и скопируйте ее вниз.
Сложение значений организовано так же как и в предыдущем разделе.
Макрофункция работает кривовато:
-
если вы измените цвет ячейки, то макрофункция не обновит значения кода (для этого нужно опять скопировать формулу из
В7
вниз или выделить ячейку, нажать клавишу
F2
и затем
ENTER
) -
функция возвращает только 56 цветов (так называемая палитра EXCEL), т.е. если цвета близки, например, зеленый и светло зеленый, то коды этих цветов могут совпасть. Подробнее об этом
см. лист файла примера Colors
. Как следствие, будут сложены значения из ячеек с разными цветами.
С помощью VBA
В
файле примера на листе VBA
приведено решение с помощью VBA. Решений может быть множество:
- можно создать кнопку, после нажатия она будет вводить код цвета в соседний столбец (реализован этот вариант).
- можно написать пользовательскую функцию, которая будет автоматически обновлять код цвета при изменении цвета ячейки (реализовать несколько сложнее);
- можно написать программу, которая будет анализировать диапазон цветных ячеек, определять количество различных цветов, вычислять в отдельном диапазоне суммы для каждого цвета (реализовать не сложно, но у каждого пользователя свои требования: ячейки с суммами должны быть в определенном месте, необходимо учесть возможность дополнения диапазона новыми значениями и пр.).
Если вы активно используете различные заливки и цвета шрифта на листах Excel для выделения различных типов ячеек или значений, вам, скорее всего, захочется узнать, сколько ячеек выделено определенным цветом. Если в ячейках хранятся числа, вы, вероятно, захотите вычислить сумму всех ячеек с одинаковым заполнением, например сумму всех красных кровяных телец.
Как известно, Microsoft Excel предоставляет ряд функций для различных целей, и логично предположить, что существуют формулы для подсчета ячеек по цвету. Но, к сожалению, нет формулы, позволяющей складывать или считать по цвету на обычном листе Excel.
Если вы не используете сторонние надстройки, есть только одно решение: создать пользовательскую функцию (UDF). Если вы не знакомы с этой технологией или никогда не слышали этот термин, не пугайтесь, вам не нужно программировать себя. Здесь вы найдете отличный готовый код (написанный нашим гуру по Excel), и все, что вам нужно сделать, это скопировать и вставить его в свою книгу.
- Подсчитайте и суммируйте по цвету, когда клетки раскрашены вручную
- Мы считаем сумму и количество ячеек на цвет по всей книге
- Подсчет и суммирование по цвету, когда к ячейкам применяются правила условного форматирования
Предположим, у нас есть таблица бизнес-заказов, в которой ячейки в столбце «Доставка» окрашены в соответствии со своими значениями: «Просрочено через X дней» — оранжевым, «Доставлено» — зеленым, «Просрочено» — красным.
Теперь мы хотим автоматически подсчитывать количество ячеек в зависимости от их цвета, то есть подсчитывать количество красных, зеленых и оранжевых ячеек на листе. Как я уже сказал выше, прямого решения этой проблемы нет. Но, к счастью, в нашей команде есть очень опытные и знающие гуру Excel, и один из них написал безупречный код для Excel 2010 и 2013. Итак, просто выполните 5 простых шагов, описанных ниже, и через несколько минут вы узнаете количество и сумму ячеек вам нужны цвета.
- Откройте книгу Excel и нажмите Alt + F11, чтобы запустить редактор Visual Basic для приложений (VBA).
- Щелкните правой кнопкой мыши имя книги в области «Проект — проект VBA», которая находится в левой части экрана, а затем выберите «Вставить»> «Модуль» в появившемся контекстном меню.
- Вставьте следующий код в свой лист:
Функция GetCellColor (xlRange As Range) Dim indRow, indColumn As Long Dim arResults () Application.Volatile Если xlRange — ничего, установите xlRange = Application.ThisCell End If If xlRange.Count> 1 Then ReDim arResults (1 To xlRange.Rows.Count , 1 в xlRange.Columns.Count) Для indRow = 1 в xlRange.Rows.Count Для indColumn = 1 В xlRange.Columns.Count arResults (indRow, indColumn) = xlRange (indRow, indColumn) .GetInterior.Color = Next arResults El GetCellColor = xlRange.Interior.Color End If End Функция Функция GetCellFontColor (xlRange As Range) Dim indRow, indColumn As Long Dim arResults () Application.Volatile Если xlRange Is Nothing, Установите xlRange = Application.ThisCell. EndCount Если xlRange> If xlRange 1, то ReDim arResults (1 в xlRange.Rows.Count, 1 в xlRange.Columns.Count) для indRow = 1 в xlRange.Rows.Count для indColumn = 1 в xlRange.Columns.Count arResults (indRow , index cellCurrent As Range Dim cntRes As Long Application.Volatile cntRes = 0 indRefColor = cellCRefsColor 1) .Interiors. Цвет для каждой ячейки Текущий в rData Если indRefColor = cellCurrent.Interior.Color Тогда cntRes = cntRes + 1 Конец Если Следующая ячейка Текущий CountCellsByColor = cntRes Конечная функция Функция SumCellsByColor (rData As Range, RangeRimRim As long cellimCurrent As Range. = cellRefColor.Cells (1, 1) .Interior.Color Для каждой ячейкиCurrent In rData If indRefColor = cellCurrent.Interior.Color Then sumRes = WorksheetFunction.Sum (cell) sumRrent If Next cellCurrent SumCellsByColor = sumRes End Function As CountCellvalsByCounter Range) As Long Dim indRefColor As Long Dim cell Current As Range Dim cntRes As Long Application. Volatile cntRes = 0 indRefColor = cellRefColor.Cells (1, 1) .Font.Color Для каждой ячейкиCurrent In rData If indRefColor = cellCurrent.Font.Color Then cntRes = cntRes + 1 End If Next cellCurrent Range CountCellsByFontColor Function) Dim indRefColor As Long Dim cellCurrent As Range Dim sumRes Application.Volatile sumRes = 0 indRefColor = cellRefColor.Cells (1, 1) .Font.Color For each cellCurrent In rData If indRefColorF = cell.Current. Затем sumRes = WorksheetFunction.Sum (cellCurrent, sumRes) End If Next cellCurrent SumCellsByFontColor = sumRes End Function
- Сохраните книгу Excel как .xlsm (книга Excel с поддержкой макросов). Если вам неудобно работать с VBA, см. «Как вставить и запустить код VBA в Excel» для получения подробных инструкций и множества полезных советов.
- Когда все закулисные действия будут выполнены, выберите ячейки, в которые вы хотите вставить результат, и вставьте в них функцию CountCellsByColor:
CountCellsByColor (диапазон; код_цвета)
В этом примере мы используем формулу = CountCellsByColor (F2: F14, A17), где F2: F14 — это диапазон, содержащий цветные ячейки, которые вы хотите подсчитать. Ячейка A17: содержит определенный цвет заливки, в нашем случае красный.
Точно так же запишите формулу для других цветов, которые вы хотите вычислить, в таблице (желтый и зеленый).
Если цветные ячейки содержат числовые данные (например, столбец Qty в нашей таблице), вы можете просуммировать значения на основе цвета выбранной ячейки, используя аналогичную функцию SumCellsByColor:
SumCellsByColor (диапазон, код_цвета)
Как показано на скриншоте ниже, мы использовали формулу:
= SumCellsByColor (D2: D14, A17)
где D2: D14 — диапазон, A17 — ячейка с образцом цвета.
Точно так же вы можете подсчитывать и суммировать ячейки на основе цвета шрифта, используя функции CountCellsByFontColor и SumCellsByFontColor соответственно.
Примечание. Если после применения описанного выше кода VBA вам вдруг понадобится вручную раскрасить некоторые другие ячейки, сумма и количество ячеек не будут автоматически пересчитаны после этих изменений. Не ругайте нас, это не ошибки кода
Фактически, это нормальное поведение макросов Excel, сценариев VBA и определяемых пользователем функций (UDF). Дело в том, что все эти функции вызываются только путем изменения данных на листе, но Excel не рассматривает изменение цвета шрифта или заливки ячеек как изменение данных. Поэтому после изменения цвета ячейки вручную просто поместите курсор на любую ячейку и нажмите F2, затем Enter, количество и количество будут обновлены позже. Это должно быть сделано при работе с любыми макросами далее в этой статье.
Считаем сумму и количество ячеек по цвету во всей книге
Приведенный ниже сценарий Visual Basic был написан в ответ на один из комментариев читателей (также наш гуру Excel) и выполняет в точности действия, указанные автором комментария, то есть подсчитывает количество и сумму ячеек определенного цвета на всех листах эта книга. Итак, вот этот код:
WbkCountCellsByColor Функция (cellRefColor Как Range) Dim Dim vWbkRes wshCurrent Как Worksheet Application.ScreenUpdating = False Application.Calculation = xlCalculationManual vWbkRes = 0 Для каждого wshCurrent В Worksheets wshCurrentWolkbActivate xBsbSfKD Dimension ApplicationCurrent В Worksheets wshCurrentWolkbActivate xBsbSfK Ложные ApplicationCalculation SumCellsByColor (wshCurrent.UsedRange, cellRefColor) Далее Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic WbkSumCellsByColor = vWbbk
Добавьте этот макрос так же, как и в предыдущем коде. Чтобы получить количество и сумму цветных ячеек, используйте следующие формулы:
= WbkCountCellsByColor()
= WbkSumCellsByColor()
Просто вставьте одну из этих формул в любую пустую ячейку на любом листе Excel. Вам не нужно указывать диапазон, но вам нужно указать любую ячейку с желаемой заливкой в круглых скобках, например = WbkSumCellsByColor (A1), и формула вернет сумму всех ячеек в книге, нарисованных в том же цвет.
Пользовательские функции для определения кодов цвета заливки ячеек и цвета шрифта
Здесь вы найдете наиболее важные моменты обо всех функциях, которые мы использовали в этом примере, а также пару новых функций, которые определяют цветовые коды.
Примечание. Помните, что все эти формулы будут работать, если вы уже добавили настраиваемую функцию в книгу Excel, как показано ранее в этой статье.
Функции, которые считают количество по цвету:
- CountCellsByColor (range, color_code) — подсчитывает ячейки с определенным цветом заливки. В приведенном выше примере мы использовали следующую формулу для подсчета количества ячеек в зависимости от их цвета:
= ColorCellCount (F2: F14, A17)
где F2: F14 — выбранный диапазон, A17 — ячейка с желаемым цветом заливки.
Все формулы, перечисленные ниже, работают по одному принципу.
- CountCellsByFontColor (range, color_code) — подсчитывает ячейки с указанным цветом шрифта.
Функции, которые суммируют значения по цвету ячейки:
- SumCellsByColor (range, color_code) — вычисляет сумму ячеек с заданным цветом заливки.
- SumCellsByFontColor (range, color_code) — вычисляет сумму ячеек с заданным цветом шрифта.
Функции, которые возвращают код цвета:
- GetCellFontColor (cell) — возвращает цветовой код шрифта в выбранной ячейке.
- GetCellColor (cell) — возвращает цветовой код заливки выбранной ячейки.
Итак, подсчитать количество ячеек по их цвету и вычислить сумму значений в цветных ячейках совсем не сложно, верно? Но что, если вы не раскрашиваете ячейки вручную, а предпочитаете использовать условное форматирование, как мы это делали в статьях «Как изменить цвет заливки ячеек» и «Как изменить цвет заливки строки в зависимости от значения ячейки?
Как посчитать количество и сумму ячеек по цвету, раскрашенных при помощи условного форматирования
Если вы применили условное форматирование, чтобы установить цвет заливки ячеек на основе их значений, и теперь вы хотите подсчитать количество ячеек определенного цвета или сумму значений в них, то у меня плохие новости для вы — не существует универсальной пользовательской функции, которая будет суммировать по цвету или подсчитывать количество ячеек и возвращать результат в определенные ячейки. По крайней мере, я не слышал о таких функциях, что жаль
Конечно, вы можете найти массу кода VBA в Интернете, пытающегося сделать это, но все эти коды (по крайней мере, случаи, с которыми я сталкивался) не обрабатывают правила условного форматирования, такие как:
- Отформатируйте все ячейки на основе их значений
- Форматировать только значения, расположенные вверху или внизу
- Форматировать только значения выше или ниже среднего);
- Форматировать только уникальные или повторяющиеся значения
Кроме того, почти все эти коды VBA имеют ряд особенностей и ограничений, из-за которых они могут некорректно работать с определенными книгами или типами данных. В любом случае, вы можете попытать счастья и найти в Google идеальное решение, а если вы его найдете, вернитесь сюда и опубликуйте свою находку!
Приведенный ниже код VBA преодолевает все указанные выше ограничения и работает с электронными таблицами Microsoft Excel 2010 и 2013 с любым условным форматированием (еще раз спасибо нашему гуру!). В результате он выводит количество цветных ячеек и сумму значений в этих ячейках, независимо от типа условного форматирования, примененного к листу.
Sub SumCountByConditionalFormat () Dim indRefColor As Long Dim cellCurrent As Range Dim cntRes As Long Dim sumRes Dim cntCells As Long Dim indCurCell As Long cntRes = 0 sumRes = 0 cntCells = Selection.CountLarge indRefColorCell indRefColorCell). = WorksheetFunction.Sum (Selection (indCurCell), sumRes) End If Next MsgBox «Count =» & cntrLes & vbC & «Sum =» & sumRes & vbCrLf & & _ «Color =» & Left («000000», 6 — Len (Hex (indRefColor))) & _ Hex (indRefColor) & vbCrLf ,, «Подсчет и сумма по цвету условного формата» End Sub
Как использовать код, чтобы посчитать количество цветных ячеек и просуммировать их значения
- Добавьте приведенный выше код на свой лист, как мы это сделали в первом примере.
- Выберите диапазон (или диапазоны), в котором вы хотите подсчитать цветные ячейки или суммировать по цвету, если они содержат числовые данные.
- Удерживая Ctrl, щелкните ячейку нужного цвета, затем отпустите Ctrl.
- Нажмите Alt + F8, чтобы открыть список макросов в книге.
- Выберите макрос SumCountByConditionalFormat и нажмите «Выполнить).В результате вы увидите следующее сообщение:
В этом примере мы выбрали столбец Qty и получили следующие числа:
- Count — количество ячеек желаемого цвета; в нашем случае это красноватый цвет, используемый для выделения ячеек со значением Expired.
- Сумма — это сумма значений всех эритроцитов в столбце «Кол-во», которая представляет собой общее количество элементов, отмеченных как «Просроченные.
- Цвет — это шестнадцатеричный код цвета выбранной ячейки, в нашем случае D2.