Вы находитесь на странице: 1из 17

Contar celdas por color en Excel

El color de relleno de una celda es ampliamente utilizado por los usuarios de Excel ya que,
al resaltarla con un color diferente, podremos identificarla fácilmente en pantalla.

En ocasiones el color significará que el dato pertenece a alguna categoría específica, o tal
vez algún estatus o acción que debemos tomar basados en dicho color. El asunto es que,
cuando tenemos varias celdas con un color de relleno, es casi inevitable que llegue el
momento en que necesitemos contarlas por color.

La mayoría de los usuarios buscan de inmediato alguna función de Excel que les ayude a
contar por color, pero pronto se encuentran con que no existe una función que haga dicha
tarea.

Y es que, ninguna de las funciones de Excel puede acceder a la información de formato de


una celda. No existen funciones para saber si la letra es negrita, o para conocer el tipo de
fuente utilizada, así que tampoco existe una función para conocer el color de la fuente o el
color de relleno de una celda.

Cuando me refiero a que no existen funciones de este tipo, me refiero a las funciones
provistas de manera predeterminada por Excel. Sin embargo, es posible construir nuestra
propia función que nos ayude a contar las celdas por color.

Construir una nueva función no es cosa de novatos, pero tampoco es una tarea de altísima
complejidad, así que en esta ocasión te mostraré los pasos necesarios para que puedas
crear esa función que cuente las celdas por color.

Descargar libro de trabajo

Lo primero que debes saber es que será necesario utilizar programación VBA para crear la
nueva función. Pero no te preocupes si no sabes programar, ya que te mostraré cada una
de las acciones a tomar.

Código VBA para contar por color


El código VBA de la función ya lo he programado con anterioridad y lo encuentras a
continuación, así que solo deberás copiarlo y pegarlo en el lugar adecuado.

1 Function CONTARCOLOR(celdaOrigen As Range, rango As Range)


2
3 Application.Volatile
4
'Variables
5 Dim celda As Range
6
7 'Recorremos todas las celdas del rango
8 For Each celda In rango
9
10 'Compara la propiedad Interior.Color
11 If celda.Interior.color = celdaOrigen.Interior.color Then
CONTARCOLOR = CONTARCOLOR + 1
12 End If
13
14 Next celda
15
16 End Function
17
18

Después de copiar el código deberás abrir el Editor de Visual Basic, y para eso tienes dos
opciones:

 Pulsar el atajo de teclado ALT + F11


 Hacer clic en el botón Visual Basic de la pestaña Programador

Una vez que se abre la ventana del Editor de Visual Basic, deberás hacer clic en en el menú
Insertar > Módulo.

Se insertará un nuevo módulo de código, que llevará un nombre como Módulo1, y en el


panel de la derecha deberás pegar el código de la función tal como lo muestra la siguiente
imagen:
Con estos pasos hemos creado y habilitado la nueva función que lleva por nombre
CONTARCOLOR y cuyo uso explicaré a continuación.

Ejemplo para contar celdas por color


La función CONTARCOLOR tiene dos argumentos, el primero de ellos es la referencia a
una celda que tendrá el color de relleno que queremos contar y el segundo argumento es el
rango con las celdas que vamos a evaluar.

La siguiente imagen muestra las celdas del rango A1:A10 con diferentes colores de relleno y
la celda D1 que tiene el color azul el cual nos interesa contar.
Para contar las celdas de color azul en el rango A1:A10, debo utilizar la función
CONTARCOLOR de la siguiente manera:

=CONTARCOLOR(D1, A1:A10)

El primer argumento es la celda que contiene el color que estamos buscando y el segundo
argumento es el rango de celdas. Ingresaré la fórmula anterior en la celda D2 y al pulsar
Entrar obtendremos el siguiente resultado:
No es indispensable tener una celda diferente para especificar el color que deseamos
contar. He utilizado la celda D1 solo para ejemplificar el uso de los dos argumentos, pero
nada impide que utilicemos una celda dentro del rango como el primer argumento.
Considera la siguiente fórmula:

=CONTARCOLOR(A2, A1:A10)

En este caso, la celda A2 tiene el color azul que queremos contar, así que podemos indicar
dicha celda como el primer argumento de la función y el resultado será el mismo.
El uso de esta función es muy simple y solo deberás asegurarte de indicar en su primer
argumento una celda que tenga el color que te interesa contar. Recuerda que Excel tiene
una gama de millones de colores y por lo tanto debes tener mucho cuidado ya que podrías
ver en pantalla colores muy parecidos cuando en realidad son distintos.

Consideraciones sobre la nueva función


Para terminar la explicación de esta nueva función quiero mencionar algunas
consideraciones importantes que deberás recordar en todo momento:

 El libro donde se encuentra la nueva función deberá guardarse como un Libro


habilitado para macros o de lo contrario perderás la funcionalidad.
 La función que acabamos de crear solo puede ser utilizada en el libro de Excel donde
has copiado el código. Si quieres utilizar la función en otro libro, entonces deberás
copiar de nuevo el código en dicho libro. Existen métodos para hacer que una función
de este tipo esté disponible en todos los libros del equipo, pero eso será un tema para
otra publicación.
 Esta función solo trabajará adecuadamente en Excel 2007 y versiones posteriores.
Lamentablemente no funcionará en Excel 2003 o versiones anteriores y la explicación
detallada la encontrarás en la última sección de este artículo.
 El color que estamos evaluando es el color que se aplica a una celda con el
comando Color de relleno y no nos referimos al color de formato condicional el cual
requiere de un código VBA diferente y por lo tanto será tratado en otra publicación.
A continuación, explicaré con mayor detenimiento el código de la función para aquellos
usuarios que están interesados en el tema de la programación en Excel.

Explicación del código VBA de la función


He decidido incluir esta sección para aquellos que están un poco más familiarizados con la
programación en Excel y quieren leer una explicación más detallada sobre el código de la
función UDF que acabamos de crear.

En primer lugar, tenemos la declaración de la función la cual acepta dos


argumentos, celdaOrigen y rango.

Function CONTARCOLOR(celdaOrigen As Range, rango As Range)

Ambos argumentos son del tipo Range ya que el primer argumentos tendrá una referencia a
la celda que tiene el color que vamos a contar y el segundo argumento será la referencia al
rango que será evaluado.

La siguiente línea de código es una instrucción que se utiliza para marcar una función como
volátil, lo cual quiere decir que la función será recalculada cada vez que se efectúa un
cálculo en la hoja.

Application.Volatile

Esta instrucción es muy conveniente ya que ocasiona que el resultado de la función sea
actualizado automáticamente al momento de realizar un cambio de color en las celdas. En
la siguiente línea tenemos la declaración de la variable celda que nos ayudará al momento
de recorrer el rango evaluado.

Utilizamos el bucle For Each para recorrer cada una de las celdas del rango y puedes notar
que la instrucción hace referencia a la variable rango que es el segundo argumento de la
función.

For Each celda In rango

Por último, tenemos la instrucción más importante de la función y es la comparación de los


colores. El color de relleno está almacenado en la propiedad Interior.color y por esa razón
se hace la comparación del color de la celda original y el color de la celda del rango que
estamos evaluando.

If celda.Interior.color = celdaOrigen.Interior.color Then

Si los valores de las propiedades son iguales, quiere decir que los colores son iguales y por
lo tanto aumentamos el valor de CONTARCOLOR en uno.

CONTARCOLOR = CONTARCOLOR + 1
De esa manera recorremos todas las celdas del rango y tendremos el resultado final en
CONTARCOLOR cuyo valor es devuelto automáticamente por la función por tener el mismo
nombre.

La propiedad Interior.color
Antes de terminar la explicación del código VBA debo decir que la
propiedad Interior.color está disponible a partir de Excel 2007, así que esta macro no
funcionará para versiones anteriores.

A partir de Excel 2007 tenemos millones de colores disponibles para elegir el color de
relleno de una celda, pero eso no era posible anteriormente. En Excel 2003 y versiones
previas solo era posible elegir entre una paleta de 56 colores y dicho color era almacenado
en la propiedad Interior.ColorIndex.

A partir de Excel 2007 se creó la propiedad Interior.color ya que era imposible almacenar
millones de colores en la propiedad Interior.ColorIndex que se utilizaba anteriormente. Por
esa razón el código de nuestra función no trabajará en Excel 2003 y versiones anteriores a
menos que cambies la propiedad utilizada.

Espero que esta función sea de mucha utilidad para esos casos en los que necesites contar
las celdas por color en Excel.
Sumar y contar celdas por color
de formato condicional
Hace algunos meses publique el artículo Operaciones con colores en Excel y de inmediato
recibí preguntas sobre la posibilidad de utilizar dichas funciones para evaluar los colores
aplicados a una celda a través del formato condicional.

Las funciones creadas en ese artículo evalúan 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 “versión” para almacenar el color de fondo de una celda. Por esa
razón no es posible utilizar dichas funciones para evaluar colores establecidos a través de
una regla de formato condicional.

Así que hoy crearemos una nueva función VBA (UDF) para sumar y contar celdas por
color de formato condicional. Pero antes de iniciar con el código hablaremos un poco
sobre los objetos y propiedades que debemos evaluar para obtener el color de fondo
proveniente de un regla de formato condicional.

La colección 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 colección FormatConditions en VBA la cual enumera
todas las reglas de formato condicional aplicadas en un rango.

Para comprender el funcionamiento de esta colección haremos un ejemplo. Considera la


siguiente lista de números 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 botón de comando ActiveX en la misma hoja y colocaré el siguiente


código VBA en su evento Click:
1 Private Sub CommandButton1_Click()

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

3 End Sub

La única línea de código ejecutada se encargará de mostrar el valor de la


propiedad Count de la colección FormatConditions la cual contiene el recuento de las reglas
de formato condicional para el rango indicado. Al hacer clic sobre el botón 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 botón de comando y el número mostrado en el mensaje habrá aumentado debido a
la nueva regla creada:
Es así como la colección FormatConditions nos permite obtener información sobre las reglas
de formato condicional aplicadas a un rango de celdas. Ahora centraremos nuestra atención
a una propiedad específica de dicha colección.

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 específicamente el color de relleno se almacena en la
propiedad Interior.Color. Para demostrar el valor de esta propiedad agregaré un nuevo
botón de comando con el siguiente código:
1 Private Sub CommandButton2_Click()

2 For i = 1 To Range("A1:A10").FormatConditions.Count

3 MsgBox "Regla " & i & vbLf & _

4 "Color: " & Range("A1:A10").FormatConditions(i).Interior.Color

5 Next i

6 End Sub

El código anterior recorre todos los elementos de la colección FormatConditions y para cada
elemento mostrará un mensaje con el número de regla y su color de relleno que está
almacenado en la propiedad Interior.Color. Al pulsar el botón 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. Si
quieres saber un poco más sobre los colores en Excel consulta el artículo Evaluar el color
de fondo de una celda.
Los colores mostrados con el código anterior son los colores pertenecientes a cada una de
las reglas de formato condicional y no el color de una celda específica. 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 desafío más 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 colección de formatos haciendo una evaluación de cada regla para
descubrir si está activa.
1 Function COLORFC(Celda As Range) As Long

3 'Indicará si la relga de formato condicional está activa

4 Dim ReglaActiva As Boolean

6 'Recorrer todas las reglas de formato condicional para la celda indicada

7 For i = 1 To Celda.FormatConditions.Count

9 'Evaluar la regla FormatConditions(i)

10 With Celda.FormatConditions(i)

11

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

13 If .Type = xlCellValue Then

14

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

16 Select Case .Operator

17 Case xlBetween: ReglaActiva = Celda.Value >= Evaluate(.Formula1) _

18 And Celda.Value <= Evaluate(.Formula2)

19 Case xlNotBetween: ReglaActiva = Celda.Value <= Evaluate(.Formula1) _

20 Or Celda.Value >= Evaluate(.Formula2)

21 Case xlEqual: ReglaActiva = Evaluate(.Formula1) = Celda.Value

22 Case xlNotEqual: ReglaActiva = Evaluate(.Formula1) <> Celda.Value

23 Case xlGreater: ReglaActiva = Celda.Value > Evaluate(.Formula1)

24 Case xlLess: ReglaActiva = Celda.Value < Evaluate(.Formula1)

25 Case xlGreaterEqual: ReglaActiva = Celda.Value >= Evaluate(.Formula1)

26 Case xlLessEqual: ReglaActiva = Celda.Value <= Evaluate(.Formula1)


27 End Select

28

29 'Si la regla es una expresión (Fórmula)

30 ElseIf .Type = xlExpression Then

31

32 Application.ScreenUpdating = False
33 Celda.Select

34 ReglaActiva = Evaluate(.Formula1)

35 Range(ActiveCell.Address).Select

36 Application.ScreenUpdating = True

37

38 End If

39

40 'Devolver el color si la regla está activa


41 If ReglaActiva Then
42 COLORFC = .Interior.Color
43 Exit Function
44 End If

45

46 End With
47 Next i
48

49 End Function

Las primeras líneas de código se encargan de recorrer todas las reglas de formato
condicional para la celda proporcionada. La primera validación 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 más tipos de
reglas de formato condicional, de hecho la enumeración XlFormatConditionType contiene 14
tipos diferentes, pero solamente los dos tipos mencionados anteriormente tienen una
manera de ser evaluados desde VBA. Por esta razón la función COLORFC considera en
primer lugar las reglas de formato condicional que evalúan directamente el valor de una
celda.
El cuadro de diálogo anterior muestra precisamente la lista de reglas de formato condicional
que son del tipo xlCellValue y que por lo tanto serán reconocidas por nuestra función. Ahora
hagamos una prueba con los datos de ejemplo para ver cómo la función
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 función VBA funciona correctamente al devolver el código de color adecuado para
cada celda. El otro tipo de reglas consideradas en la función COLORFC son aquellas
basadas en una expresión, que generalmente son las reglas basadas en una fórmula que
contiene funciones de Excel. Pero debo darte una mala noticia, esta opción solo funcionará
si tenemos Excel en inglés. Y a continuación explico por qué.
Al momento de crear una regla de formato condicional que utilice una función de Excel,
colocaremos su nombre en castellano. Dicha fórmula 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 función en español lo cual ocasionará un error ya que VBA
solamente entiende las funciones de Excel por su nombre en inglés. Aún así he dejado esta
funcionalidad porque existe un porcentaje de usuarios que utilizan Excel en inglés y ellos
podrán obtener el color de las celdas que utilicen reglas de formato condicional basadas en
fórmulas.

Después de todas estas aclaraciones (que eran necesarias), tenemos una función 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 función VBA de la siguiente
manera:
1 Function SUMARPORCOLORFC(CeldaColor As Range, Rango As Range) As Double

3 Dim Celda As Range

4 Dim Total As Double

5 Dim Color As Long

7 Color = COLORFC(CeldaColor)
8

9 For Each Celda In Rango.Cells

10 If COLORFC(Celda) = Color Then

11 Total = Total + Celda.Value

12 End If

13 Next Celda

14

15 SUMARPORCOLORFC = Total

16

17 End Function

El primer argumento de la función 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 función
COLORFC. Posteriormente se hará un recorrido por todo el rango de celdas para sumar el
valor de aquellas que tengan el mismo color. Observa cómo trabaja nuestra función con los
datos de ejemplo:

La función 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 función.

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 función anterior para que en lugar sumar el valor de la celda se sume el
valor 1 por cada celda con el color indicado. El código de esta nueva función es el siguiente:
1 Function CONTARPORCOLORFC(CeldaColor As Range, Rango As Range) As Integer

3 Dim Celda As Range


4 Dim Total As Integer

5 Dim Color As Long

7 Color = COLORFC(CeldaColor)

9 For Each Celda In Rango.Cells

10 If COLORFC(Celda) = Color Then

11 Total = Total + 1

12 End If

13 Next Celda

14

15 CONTARPORCOLORFC = Total

16

17 End Function

Al utilizar esta función con los mismos datos de ejemplo podrás observar que la función
CONTARPORCOLORFC nos devuelve el valor 2 que corresponde a las celdas con el
mismo color que la celda A3:

Descarga el libro de trabajo para comenzar a sumar y contar celdas por color de formato
condicional en tus propios libros de trabajo. Solo recuerda que las funciones creadas en
este artículo validarán solo las reglas de formato condicional basadas en el valor de la
celda. También recuerda que podrás evaluar reglas basadas en fórmulas solamente si
tienes una versión en inglés de Excel.

Вам также может понравиться