You are on page 1of 13

Sumar y contar celdas

por color de formato


condicional
Las funciones creadas evalan la propiedad Interior.Color que tiene
cada una de las celdas en Excel, sin embargo, el formato condicional
no utiliza dicha propiedad sino que tiene su propia versin para
almacenar el color de fondo de una celda. Por esa razn no es posible
utilizar dichas funciones para evaluar colores establecidos a travs de
una regla de formato condicional.
la funcin VBA (UDF) para sumar y contar celdas por color de
formato condicional. Los objetos y propiedades que debemos
evaluar para obtener el color de fondo proveniente de un regla de
formato condicional.

La coleccin FormatConditions
Primero debemos recordar que un mismo rango de celdas en Excel
puede estar sujeto a varias reglas de formato condicional al mismo
tiempo, as que para guardar esa lista de formatos condicionales se
cre la coleccin FormatConditions en VBA la cual enumera todas las
reglas de formato condicional aplicadas en un rango.
Para comprender el funcionamiento de esta coleccin haremos un
ejemplo. Considera la siguiente lista de nmeros en el rango A1:A10
donde he aplicado una regla de formato condicional que resalta en
color rojo los valores mayores a 750.

Ahora insertar un botn de comando ActiveX en la misma hoja y


colocar el siguiente cdigo VBA en su evento Click:
1
2
3

Private

Sub

CommandButton1_Click()

MsgBox Range("A1:A10").FormatConditions.Count
End

Sub

La nica lnea de cdigo ejecutada se encargar de mostrar el valor de


la propiedad Count de la coleccin FormatConditions la cual contiene el
recuento de las reglas de formato condicional para el rango indicado.
Al hacer clic sobre el botn de comando se mostrar el siguiente
mensaje:
El mensaje nos indica que el rango A1:A10 tiene una sola regla de
formato condicional. Ahora crear una segunda regla para el mismo
rango que resaltar de color verde todas las celdas con un valor
menor a 250. Una vez creada la regla de formato condicional, volver
a pulsar el botn de comando y el nmero mostrado en el mensaje
habr aumentado debido a la nueva regla creada:

Es as como la coleccin FormatConditions nos permite obtener


informacin sobre las reglas de formato condicional aplicadas a un
rango de celdas. Ahora centraremos nuestra atencin a una
propiedad especfica de dicha coleccin.

La propiedad FormatCondition.Interior.Color
Cada regla de formato condicional almacena el estilo que aplicar a
las celdas que cumplan con las condiciones establecidas y
especficamente el color de relleno se almacena en la propiedad
Interior.Color. Para demostrar el valor de esta propiedad agregar un
nuevo botn de comando con el siguiente cdigo:
Private

Sub

CommandButton2_Click()

1
For i = 1 To Range("A1:A10").FormatConditions.Count
2
MsgBox "Regla " & i & vbLf & _
3
"Color: " &
4
Range("A1:A10").FormatConditions(i).Interior.Color
5
Next i
6
End

Sub

El cdigo anterior recorre todos los elementos de la coleccin


FormatConditions y para cada elemento mostrar un mensaje con el
nmero de regla y su color de relleno que est almacenado en la
propiedad Interior.Color. Al pulsar el botn obtengo el siguiente
resultado:

El color devuelto ser un valor entre 0 y 16777215 que corresponde a


una de las combinaciones de colores primarios (rojo, verde y azul) que
se pueden formar en Excel.
Los colores mostrados con el cdigo anterior son los colores
pertenecientes a cada una de las reglas de formato condicional y no el
color de una celda especfica. Para conocer el color de formato
condicional aplicado a una celda ser necesario encontrar la regla que
se cumple sobre dicha celda para entonces obtener el color
correspondiente.

Macro para obtener el color de una celda

El desafo ms grande al crear una macro para obtener el color de


una celda es descubrir la regla de formato condicional que est activa.
Para eso utilizamos un bucle For Next que recorrer toda la coleccin
de formatos haciendo una evaluacin de cada regla para descubrir si
est activa.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9

Function

COLORFC(Celda As

Range) As

Long

'Indicar si la relga de formato condicional est activa


Dim

ReglaActiva As

Boolean

'Recorrer todas las reglas de formato condicional para la celda


indicada
For

i = 1 To

Celda.FormatConditions.Count

'Evaluar la regla FormatConditions(i)


With

Celda.FormatConditions(i)

'Si la regla est basada en el valor de la celda


If

.Type = xlCellValue Then

'Identificar el operador de la regla y evaluar si est activa


Select
Case

Case

.Operator

xlBetween:

ReglaActiva = Celda.Value >=

Evaluate(.Formula1) _
And
Case

xlNotBetween:

Celda.Value <= Evaluate(.Formula2)

ReglaActiva = Celda.Value <=

Evaluate(.Formula1) _
Or
Case

xlEqual:

Celda.Value >= Evaluate(.Formula2)

ReglaActiva = Evaluate(.Formula1) =

Celda.Value
Case

xlNotEqual:

ReglaActiva = Evaluate(.Formula1) <>

2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3

Celda.Value
Case

xlGreater:

ReglaActiva = Celda.Value >

Evaluate(.Formula1)
Case

xlLess:

ReglaActiva = Celda.Value <

Evaluate(.Formula1)
Case

xlGreaterEqual: ReglaActiva = Celda.Value >=

Evaluate(.Formula1)
Case

xlLessEqual:

ReglaActiva = Celda.Value <=

Evaluate(.Formula1)
End

Select

'Si la regla es una expresin (Frmula)


ElseIf

.Type = xlExpression Then

Application.ScreenUpdating = False
Celda.Select
ReglaActiva = Evaluate(.Formula1)
Range(ActiveCell.Address).Select
Application.ScreenUpdating = True

End

If

'Devolver el color si la regla est activa


If

ReglaActiva Then
COLORFC = .Interior.Color
Exit
If

End

With

Next

End

Function

7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
4
6
4
7
4
8
4
9

End

Function

Las primeras lneas de cdigo se encargan de recorrer todas las reglas


de formato condicional para la celda proporcionada. La primera
validacin importante es sobre la propiedad Type que nos permite
saber el tipo de regla que estamos analizando, ya sea del tipo
xlCellValue o del tipo xlExpression. Es importante mencionar que
existen ms tipos de reglas de formato condicional, de hecho la
enumeracin XlFormatConditionType contiene 14 tipos diferentes,
pero solamente los dos tipos mencionados anteriormente tienen una
manera de ser evaluados desde VBA. Por esta razn la funcin

COLORFC considera en primer lugar las reglas de formato condicional


que evalan directamente el valor de una celda.

El cuadro de dilogo anterior muestra precisamente la lista de reglas


de formato condicional que son del tipo xlCellValue y que por lo tanto
sern reconocidas por nuestra funcin. Ahora hagamos una prueba
con los datos de ejemplo para ver cmo la funcin COLORFC devuelve
el color aplicado a cada celda de acuerdo a la regla de formato
condicional activa. Recuerda que las reglas creadas resaltan de rojo
las celdas con un valor superior a 750 y de color verde los valores
menores a 250.

Nuestra funcin VBA funciona correctamente al devolver el cdigo de


color adecuado para cada celda. El otro tipo de reglas consideradas
en la funcin COLORFC son aquellas basadas en una expresin, que
generalmente son las reglas basadas en una frmula que contiene
funciones de Excel. Pero debo darte una mala noticia, esta opcin
solo funcionar si tenemos Excel en ingls. Y a continuacin explico
por qu.

Al momento de crear una regla de formato condicional que utilice una


funcin de Excel, colocaremos su nombre en castellano. Dicha
frmula se almacenar en una propiedad de la regla de formato
condicional y al momento de evaluarla desde VBA la cadena de texto
contendr el nombre de la funcin en espaol lo cual ocasionar un
error ya que VBA solamente entiende las funciones de Excel por su
nombre en ingls. An as he dejado esta funcionalidad porque existe
un porcentaje de usuarios que utilizan Excel en ingls y ellos podrn
obtener el color de las celdas que utilicen reglas de formato
condicional basadas en frmulas.
Despus de todas estas aclaraciones (que eran necesarias), tenemos
una funcin que nos devolver el color aplicado a una celda desde
una regla de formato condicional, as que ahora solo debemos
utilizarla para sumar o contar celdas por color.

Sumar por color de formato condicional

Para sumar por color de formato condicional crear una nueva


funcin VBA de la siguiente manera:
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7

Function

SUMARPORCOLORFC(CeldaColor As

Range, Rango As

Range) As

Double

Dim

Celda As

Range

Dim

Total As

Double

Dim

Color As

Long

Color = COLORFC(CeldaColor)

For

Each
If

Celda In

Rango.Cells

COLORFC(Celda) = Color Then


Total = Total + Celda.Value

End
Next

If

Celda

SUMARPORCOLORFC = Total

End

Function

El primer argumento de la funcin es una celda que contiene el color


por el cual deseamos sumar, as que una de las primeras acciones es
obtener dicho color con la funcin COLORFC. Posteriormente se har
un recorrido por todo el rango de celdas para sumar el valor de
aquellas que tengan el mismo color. Observa cmo trabaja nuestra
funcin con los datos de ejemplo:

La funcin devuelve correctamente la suma de las celdas A1 y A9 que


son las que tienen el mismo color que la celda A1 que ha sido
indicada como el primer argumento de la funcin.

Contar por color de formato condicional


Si en lugar de sumar deseamos contar las celdas que tienen un
mismo color, ser suficiente con modificar la funcin anterior para
que en lugar sumar el valor de la celda se sume el valor 1 por cada
celda con el color indicado. El cdigo de esta nueva funcin es el
siguiente:
1
2
3
4
5
6
7
8
9
1
0

Function

CONTARPORCOLORFC(CeldaColor As

Integer

Dim

Celda As

Range

Dim

Total As

Integer

Dim

Color As

Long

Color = COLORFC(CeldaColor)

For

Each

Celda In

Rango.Cells

Range, Rango As

Range) As

1
1
1
2
1
3
1
4
1
5
1
6
1
7

If

COLORFC(Celda) = Color Then


Total = Total + 1

End
Next

If

Celda

CONTARPORCOLORFC = Total

End

Function

Al utilizar esta funcin con los mismos datos de ejemplo podrs


observar que la funcin CONTARPORCOLORFC nos devuelve el valor 2
que corresponde a las celdas con el mismo color que la celda A3:

You might also like