Sumar y contar celdaspor color de formato condicional Las funciones creadas 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. la función 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 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. Una vez creada la regla de formato condicional.FormatConditions.Ahora insertaré un botón de comando ActiveX en la misma hoja y colocaré el siguiente código VBA en su evento Click: 1 2 3 Private Sub CommandButton1_Click() MsgBox Range("A1:A10"). Ahora crearé una segunda regla para el mismo rango que resaltará de color verde todas las celdas con un valor menor a 250.Count 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. volveré a pulsar el botón de comando y el número mostrado en el mensaje habrá aumentado debido a la nueva regla creada: . 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. Es así como la colección FormatConditions nos permite obtener información sobre las reglas de formato condicional aplicadas a un rango de celdas.Color.Color 5 Next i 6 End Sub . Para demostrar el valor de esta propiedad agregaré un nuevo botón de comando con el siguiente código: 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").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.FormatConditions(i). La propiedad FormatCondition.Interior. Ahora centraremos nuestra atención a una propiedad específica de dicha colección. verde y azul) que se pueden formar en Excel. 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.Color.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. 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. Macro para obtener el color de una celda . 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. Formula2) ReglaActiva = Evaluate(.Operator xlBetween: ReglaActiva = Celda.Value <= Evaluate(.Type = xlCellValue Then 'Identificar el operador de la regla y evaluar si está activa Select Case Case .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.Formula2) ReglaActiva = Celda.Formula1) _ And Case xlNotBetween: Celda.Value >= Evaluate(.Formula1) <> .Count 'Evaluar la regla FormatConditions(i) With Celda.Value >= Evaluate(.Value Case xlNotEqual: ReglaActiva = Evaluate(.Value <= Evaluate(. 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.Formula1) _ Or Case xlEqual: Celda. 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.FormatConditions(i) 'Si la regla está basada en el valor de la celda If .Formula1) = Celda. Color Exit If End With Next End i Function .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.ScreenUpdating = True End If 'Devolver el color si la regla está activa If ReglaActiva Then COLORFC = .Select ReglaActiva = Evaluate(.Address).Formula1) Range(ActiveCell.Formula1) Case xlGreaterEqual: ReglaActiva = Celda.Select Application.Interior.Value <= Evaluate(.Formula1) End Select 'Si la regla es una expresión (Fórmula) ElseIf .Type = xlExpression Then Application.Value < Evaluate(.Formula1) Case xlLess: ReglaActiva = Celda.Formula1) Case xlLessEqual: ReglaActiva = Celda.Value > Evaluate(.Value >= Evaluate(.Value Case xlGreater: ReglaActiva = Celda.ScreenUpdating = False Celda. pero solamente los dos tipos mencionados anteriormente tienen una manera de ser evaluados desde VBA. ya sea del tipo xlCellValue o del tipo xlExpression.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 líneas de código se encargan de recorrer todas las reglas de formato condicional para la celda proporcionada. Es importante mencionar que existen más tipos de reglas de formato condicional. La primera validación importante es sobre la propiedad Type que nos permite saber el tipo de regla que estamos analizando. Por esta razón la función . de hecho la enumeración XlFormatConditionType contiene 14 tipos diferentes. .COLORFC considera en primer lugar las reglas de formato condicional que evalúan directamente el valor de una celda. 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. 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. Y a continuación explico por qué. esta opción solo funcionará si tenemos Excel en inglés. El otro tipo de reglas consideradas en la función COLORFC son aquellas basadas en una expresión. .Nuestra función VBA funciona correctamente al devolver el código de color adecuado para cada celda. que generalmente son las reglas basadas en una fórmula que contiene funciones de Excel. Pero debo darte una mala noticia. colocaremos su nombre en castellano. tenemos una función que nos devolverá el color aplicado a una celda desde una regla de formato condicional. Después de todas estas aclaraciones (que eran necesarias). 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. así que ahora solo debemos utilizarla para sumar o contar celdas por color.Al momento de crear una regla de formato condicional que utilice una función de Excel. Sumar por color de formato condicional . 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. Observa cómo trabaja nuestra función con los datos de ejemplo: . 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.Value End Next If Celda SUMARPORCOLORFC = Total End Function El primer argumento de la función es una celda que contiene el color por el cual deseamos sumar.Para sumar por color de formato condicional crearé una nueva función 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.Cells COLORFC(Celda) = Color Then Total = Total + Celda. Contar por color de formato condicional Si en lugar de sumar deseamos contar las celdas que tienen un mismo color.Cells Range. El código de esta nueva función 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. 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. Rango As Range) As .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. 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 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: .
Report "Sumar y Contar Celdas Por Color de Formato Condicional"