Excel 2007-2010. El formato condicional y VBA. (Parte II)

Tamaño de letra:

Formato condicional independiente.

Ya vimos en el anterior artículo, uno de los problemas de VBA para obtener el color de fondo: que las fórmulas del formato condicional deben ser absolutas y esto puede resultar un trabajo extra, ya que, nos obliga a ir celda a celda. Hoy veremos cómo resolver el problema del tutorial anterior.

Siguiendo con el mismo ejercício, para obtener el color real que vemos en pantalla y que es el resultado de evaluar la condición del "formato condicional", hago el siguiente ejemplo básico:

Formato condicional y VBA

Como puedes observar, esta vez sí que la columna D nos muestra correctamente el color real. Se puede apreciar que es porque a cada celda del rango B2:B5 le he puesto un formato condicional independiente con la fórmula que ves en la columna E. Por ejemplo, para que sepas hacerlo, selecciono la celda B5, voy a Formato condicional ? Administrar reglas ? Nueva regla ? Utilice una fórmula que determine las celdas para aplicar formato y abajo en "Dar formato a los valores donde esta fórmula sea verdadera" escribo lo que ves en la celda E5:

=(B5>3)

Y ahora pulso el botón de abajo de formato y pongo de relleno el color verde (R:0, V:255, A:0) y letra en blanco.. Y lo mismo con las otras 3 celdas B4, B3 y B2.

La columna C es la misma que vimos en el tutorial anterior. Voy a crear ahora una simple función que calcule el color de fondo real como ves en la columna D. La función la voy a llamar GetColorCondicional(). Así que en las siguientes celdas escribo en la barra de fórmulas lo siguiente:

  • D2: =GetColorCondicional(B2)
  • D3: =GetColorCondicional(B3)
  • D4: =GetColorCondicional(B4)
  • D5: =GetColorCondicional(B5)

Ahora voy a crear una macro que pienso que es una forma muy rápida para agregar automáticamente un módulo y código: Ficha Programador ? Grabar macro ? Nombre de la macro el que quieras ? Detener macro. Seguidamente vamos a Programador ? Visual Basic y estaremos, normalmente, en un nuevo módulo creado, con el código de la macro que acabamos de hacer. Borro todo el código de la macro y agrego el siguiente:

Public Function GetColorCondicional(ByVal celda As Range)
 
    If celda.FormatConditions.Count = 0 Then Exit Function
 
    If CondicionActiva(celda) Then
        GetColorCondicional = celda.FormatConditions(1).Interior.ColorIndex
    Else
        GetColorCondicional = celda.Interior.ColorIndex
    End If
 
    Select Case GetColorCondicional
        Case 2
            GetColorCondicional = "BLANCO"
        Case 4
            GetColorCondicional = "VERDE"
        Case 5
            GetColorCondicional = "AZUL"
        Case Else
            GetColorCondicional = "OTRO"
    End Select
End Function
 

Lo que he llamado condición activa, es sencillo de entender porque es la evaluación de la fórmula del formato condicional. Su código es el siguiente:

Public Function CondicionActiva(ByVal celda As Range) As Boolean
    Dim formato As FormatCondition
    Set formato = celda.FormatConditions(1)
    If Application.Evaluate(formato.Formula1) Then
        CondicionActiva = True
    Else
        CondicionActiva = False
    End If
End Function
 

Creo que es muy sencillo. Como puedes observar, compruebo que en la celda existan condiciones (If celda.FormatConditions.Count = 0...). Tú puedes mejorar mucho más el código, este es muy básico para que sepas interpretar el problema que surge.

Por si te interesa, te añado también el código para generar la columna E y obtener la fórmula que es evaluada:

Public Function Formulas(ByVal celda As Range) As String
    Dim formato As FormatCondition
    Set formato = celda.FormatConditions(1)
    Formulas = formato.Formula1
End Function
 

Opinión personal

Considero que la herramienta Excel de Microsoft es completísima y puedes realizar complejas operaciones para tu empresa, trabajo, centro educativo, cosas personales etc. Para que su uso pueda ser sencillo y potente, se recurre a opciones como el formato condicional que te permite obtener un reporte muy interesante y profesional. Yo creo que el uso del formato condicional debe hacerse cuando no quieras interferir con código VBA. Además el formato condicional que hemos visto hoy, en VBA también se hace en pocos segundos. Yo para este caso, prefiero hacer todo desde VBA.

Hay cosas de Excel que me parecen curiosas y, a veces, chocan entre ellas mismas:

  • Las fórmulas que introduces en las celdas no son en todos los excel iguales y dependen, entre otras cosas, del lenguaje de tu versión. De este modo, la función PROMEDIO en un Excel en español, es lo mismo que la función AVERAGE en inglés.
  • VBA (Visual Basic for Applications) está, sin embargo, en inglés.
  • Si juntamos estos dos puntos, nos podemos encontrar, por ejemplo, que al evaluar una condición en un formato condicional, verás que la fórmula a evaluar con VBA tiene que estar en inglés. Mira, voy a hacer una inspección a 4 códigos y observa que el único válido es el primero y que verás que está en inglés. Observa también, que las dos celdas B3 y B2 están separadas por coma (,) mientras que en la celda y en un formato condicional esa fórmula te dará error:

Excel, evaluar fórmula

Referencias

Los códigos usados en este artículo son muy sencillos pero el que quiera avanzar más, tiene a su disposición este completo documento desarrollando toda esta teoría:

http://www.cpearson.com/excel/cfcolors.htm

Última actualización: Sábado, 02 Junio 2012
Comentarios  
0 # ALBERTO LIBEDINSKY 24-11-2021 05:01
Hola Karmany. Muchas gracias por la ayuda. Grabé la macro,y al intentar correrla , dá ERROR '1004' en tiempo de ejecución.
en la sentencia:
ExecuteExcel4Ma cro "(2,1,""$ #,##0.00"")"(In tenta aplicar formato condicional - formato numerico "Moneda" a las celdas en que se cumple la condición ($A2 = $A1) (como en la columna A - celda A!- està eñ campo Numero, corresponde aplicar Formato condicional en la celda A3 (formato "Moneda") cuando el valor de la celda A3 sea = al de la ceda A2.Igual en celda A4, si el valor de celda A4 es igual al de celda A3.
La instruccion ExecuteExcel4Ma cro "(2,1,""$ #,##0.00"")" dá el error '1004' en tiempo de ejecución.
Un error de código generado por la grabadora de macros. Solución 1:escribir correctamente el código "ExecuteExcel4Ma cro.
Solución2:escribir todo el código para formato condicional, hay que saber programar en VsualBasic. En síntesis: No sé como solucionar mi problema. Gracias por leer.
Responder | Responder con una citación | Citar
0 # ALBERTO LIBEDINSKY 11-11-2021 01:45
Perdon por los errores en el comentario anterior. El correcto es el siguiente:
Excelente artículo. Tengo una consulta para aplicar FC en una Tabla:condicion : $A2=$A1 . Por ejemplo, si tengo una Tabla con las ventas de una empresa realizadas por cada empleado, A1 = "nº de Legajo" , B1 = "Fecha de venta" . A2=001 B2=10/01/21, A3=001 B3=15/01/21. A4 = 002 , B4 = 15/01/21. Al aplicar formato condicional, ($A2 = $A1), se va a aplicar en la celda que cumple la condición, en este caso la celda A3 (porque el Legajo (001) es igual al de A2 .Manualmente se puede hacer. Al grabar Macro y luego correr el codigo que queda grabado no funciona. Por eso estoy buscando como se escribe el codigo uttilizando FormatCondition s.Escribir un codigo con FormatCondition s y que funcione es difícil . Espero que tú o alguien que lea esto me pueda ayudar. Gracias
Responder | Responder con una citación | Citar
0 # karmany 14-11-2021 23:06
Ostras, Alberto, realmente no entiendo el formato condicional que quieres hacer. Si pudieras poner un archivo en descarga de ejemplo y explicarlo podría intentar ayudarte.
Responder | Responder con una citación | Citar
0 # Alberto Libedinsky 10-11-2021 23:56
Excelente artículo. Yo estoy buscando en google como usar Formatcondition s para aplicar Formato Condicional Numerico Personalizado y para aplicar bordes a celdas de una Tabla cuando el valor de un campo en una fila sea distinto al de la fila anterior. MAanualmente es facil: $B6 = $B5 para un formato y $B7$B6 para el otro. El problema es que la grabadora de macros no sirve para esto.Graba un codigo que no funciona.Entonc es hay que escribir el codigo con FormatCondition s, y todavía no ssé como hacerlo. Si tienes la solucion te agradezco.
Responder | Responder con una citación | Citar
0 # karmany 14-11-2021 23:03
Hola Alberto, respecto al problema de la grabación de macros: cuando realizas una grabación de macros el código generado se guarda y puedes editarlo. Cuando terminas de grabar la macro, pulsa "Alt + F11", se abrirá Microsoft Visual Basic (VBA) y, en el menú de la izquierda, desplega "módulos" y ahí te aparecerá tu módulo. Al seleccionar el módulo (normalmente, si no has hecho nada de código verás "Módulo 1" y a la derecha te aparecerá el código Visual Basic generado con tu macro. Ese código lo puedes modificar a tu antojo, hay muchísima información en Internet sobre VBA.
Responder | Responder con una citación | Citar
Escribir un comentario
Antes de publicar un comentario, usted debe aceptar nuestras condiciones de uso: Condiciones de uso. Debido al spam, todos los comentarios serán moderados. Normalmente se responde en unos minutos, refresca los comentarios para comprobarlo.



 
Visitas: 8489008