Forum Discussion
Count and Sum by Background Color, with color set by both Manual and conditional formatting
- 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 FunctionYou 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 FunctionBy 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.
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.
- reweshNov 23, 2023Copper ContributorThanks, your code works .. After 1 h of searching the internet .. thanks a lot ..Is there a way to make this dynamic or update automatically?
- HansVogelaarNov 23, 2023MVP
In my version of Excel, the result of ColourSum and ColourCount is updated automatically...
- reweshNov 24, 2023Copper Contributor
HansVogelaar I running latest beta .. can you test it on it? .. thanks
- Hr_JustinoMay 05, 2021Copper ContributorHi HansVogelaar
I have fixed the issue With ColourSum not working and in turn have made it so DColorindex would not be needed.
Here is the Code that does all I require (I Changed Double to Long in the Function ColourSum )
________________________________________________________________________________________
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 Long
Dim colo As Long
Dim c As Range
Dim colsum As Long
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
_________________________________________________________________________________________
Many Thanks HansVogelaar- HansVogelaarMay 05, 2021MVP
- Your version of ColourSum won't sum numbers with decimals correctly - it will round every number to a whole number.
- Both functions still require DColorIndex to be present in the module - if you remove the code for DColorIndex, ColourCount and ColourSum would fail.
- Hr_JustinoMay 05, 2021Copper ContributorI see I misunderstood how to input the code.
I seperated it into different modules. (Module 1,2,3 for each section of code)
I guess that is why it did not work first time around.
I have input Your code in a single module and it just works now, with decimals.
Thank you HansVogelaar
- Hr_JustinoMay 05, 2021Copper ContributorHi HansVogelaar
I have Input the code, and removed my old code to a text file on my desktop.
I run into issues when I try to run DColorIndex. I dont understand how to make the function work.
Sorry this might be a bit basic.
Your ColourCount works lovely.
But I also had trouble wit ColourSum.
The debugger show up on the line "For Each c in ran"
If you could explain how to use the function DColorIndex that would be great.
I assumed I would write the function and choose the control color and then hit enter.
"doesn't work"