Forum Discussion
Hr_Justino
May 04, 2021Copper Contributor
Count and Sum by Background Color, with color set by both Manual and conditional formatting
Hello, I have made an add-in to count and sum when colors are manually set. However when Conditional Formatting is used I.E. Setting Equal to 1 to have a red background. The VBA code ignores the Co...
- May 04, 2021
In VBA, you can use range.DisplayFormat.Interior.ColorIndex to return the color of a cell as displayed, whether through direct formatting or through conditional formatting. But unfortunately, DisplayFormat does not work when used directly in a user-defined function, so you have to use a trick.
Create a function like this:
Function DColorIndex(r As Range) As Long DColorIndex = r.DisplayFormat.Interior.ColorIndex End Function
You can then use these functions:
Function ColourCount(cel As Range, ran As Range) As Long Dim colo As Long Dim c As Range Dim cou As Long colo = cel.Interior.ColorIndex For Each c In ran If ran.Parent.Evaluate("DColorIndex(" & c.Address & ")") = colo Then cou = cou + 1 End If Next c ColourCount = cou End Function Function ColourSum(cel As Range, ran As Range) As Double Dim colo As Long Dim c As Range Dim colsum As Double colo = cel.Interior.ColorIndex For Each c In ran If ran.Parent.Evaluate("DColorIndex(" & c.Address & ")") = colo Then colsum = colsum + c.Value End If Next c ColourSum = colsum End Function
By the way 1: Excel supports many more colors than just the 56 palette colors. It might be better to use the Color property instead of the ColorIndex property.
By the way 2: in the future, please post the code instead of a screenshot of the code! That saves the person trying to help you a lot of time.
JKPieterse
May 04, 2021Silver Contributor
You can do this, but in general I advise not to use formatting as a value to do calculations with. It is far better to have your users type a value (text or number doesn't matter much) into a cell. You can then use a conditional formatting rule to color those cells accordingly. And you can then simply use SUMIFS or COUNTIFS functions to do the summary, or even better, use a pivottable.