Formato condicional
El formato condicional nos permite, de acuerdo al resultado de una expresión o formula, formatear una celda con diferentes estilos, esto es importante, solo puedes aplicar estilos de celdas existentes, por lo que asegúrate de tener algunos de prueba. Puedes establecer de una a tres condiciones, que se evaluarán una a una, veamos una primer condición sencilla.
Sub FormatoCondicional1()
Dim oDoc As Object
Dim oHojaActiva As Object
Dim oRango As Object
Dim oFC As Object
Dim mCondiciones(3) As New com.sun.star.beans.PropertyValue
oDoc = ThisComponent
oHojaActiva = oDoc.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( "A1" )
'Accedemos al formato condicional
oFC = oRango.getPropertyValue("ConditionalFormat")
'Limpiamos cualquier formato existente, si no lo haces, las condiciones
'se agregarán como segunda o tercer condición según corresponda
oFC.clear()
'Establecemos las condiciones del formato
mCondiciones(0).Name = "Operator"
'El operador =
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.EQUAL
mCondiciones(1).Name = "Formula1"
'El valor de la formula 1, es decir, si la celda = 100
mCondiciones(1).Value = "100"
mCondiciones(2).Name = "StyleName"
'En caso de que se cumpla la condiciones, aplicamos el estilo Resaltado1,
'recuerda que debes de crearlo previamente
mCondiciones(2).Value = "Resaltado1"
'Agregamos las condiciones al formato
oFC.addNew ( mCondiciones() )
'Reestablecemos la propiedad para que surtan efecto los cambios
oRango.setPropertyValue( "ConditionalFormat", oFC )
End Sub
Acabamos de agregar, a la celda A1, la condición de que, si el valor de la celda es igual a 100, le establezca el estilo de celda Resaltado1, si el estilo no existe, no te dará ningún error, simplemente no aplicará ningún formato, verifiquemos que la agrego correctamente.
Ahora intentemos, agregar dos condiciones en vez de una, por ejemplo, a la celda C1, si es igual a 50 un estilo y si es mayor a 50 otro estilo, que quedaría así.
Sub FormatoCondicional2()
Dim oDoc As Object
Dim oHojaActiva As Object
Dim oRango As Object
Dim oFC As Object
Dim mCondiciones(3) As New com.sun.star.beans.PropertyValue
oDoc = ThisComponent
oHojaActiva = oDoc.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( "C1" )
'Accedemos al formato condicional
oFC = oRango.getPropertyValue("ConditionalFormat")
oFC.clear()
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.EQUAL
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "50"
mCondiciones(2).Name = "StyleName"
mCondiciones(2).Value = "Roja"
oFC.addNew ( mCondiciones() )
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.GREATER
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "50"
mCondiciones(2).Name = "StyleName"
mCondiciones(2).Value = "Azul"
oFC.addNew ( mCondiciones() )
'Reestablecemos la propiedad para que surtan efecto los cambios
oRango.setPropertyValue( "ConditionalFormat", oFC )
End Sub
Observa la matriz de propiedades mCondiciones, esta forma de establecer pares de propiedades con un nombre (Name) y un valor (Value), ya la hemos usado anteriormente por lo que no te debe ser desconocida, la propiedad operador (Operator), es una enumeración que puede tener los siguiente valores.
com.sun.star.sheet.ConditionOperator | Valor | Valor en Interfaz |
---|---|---|
com.sun.star.sheet.ConditionOperator.NONE | 0 | Ninguna |
com.sun.star.sheet.ConditionOperator.EQUAL | 1 | Igual |
com.sun.star.sheet.ConditionOperator.NOT_EQUAL | 2 | Distinta de |
com.sun.star.sheet.ConditionOperator.GREATER | 3 | Mayor que |
com.sun.star.sheet.ConditionOperator.GREATER_EQUAL | 4 | Mayor o igual |
com.sun.star.sheet.ConditionOperator.LESS | 5 | Menor que |
com.sun.star.sheet.ConditionOperator.LESS_EQUAL | 6 | Menor o igual |
com.sun.star.sheet.ConditionOperator.BETWEEN | 7 | Entre |
com.sun.star.sheet.ConditionOperator.NOT_BETWEEN | 8 | No entre |
com.sun.star.sheet.ConditionOperator.FORMULA | 9 | Formula |
Veamos como establecer las condiciones para evaluar entre un par de valores.
Sub FormatoCondicional3()
Dim oDoc As Object
Dim oHojaActiva As Object
Dim oRango As Object
Dim oFC As Object
Dim mCondiciones(3) As New com.sun.star.beans.PropertyValue
oDoc = ThisComponent
oHojaActiva = oDoc.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( "B1:B10" )
'Accedemos al formato condicional
oFC = oRango.getPropertyValue("ConditionalFormat")
oFC.clear()
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.BETWEEN
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "0"
mCondiciones(2).Name = "Formula2"
mCondiciones(2).Value = "5"
mCondiciones(3).Name = "StyleName"
mCondiciones(3).Value = "Reprobado"
oFC.addNew ( mCondiciones() )
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.BETWEEN
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "6"
mCondiciones(2).Name = "Formula2"
mCondiciones(2).Value = "8"
mCondiciones(3).Name = "StyleName"
mCondiciones(3).Value = "Suficiente"
oFC.addNew ( mCondiciones() )
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.BETWEEN
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "9"
mCondiciones(2).Name = "Formula2"
mCondiciones(2).Value = "10"
mCondiciones(3).Name = "StyleName"
mCondiciones(3).Value = "Excelente"
oFC.addNew ( mCondiciones() )
'Restablecemos la propiedad para que surtan efecto
oRango.setPropertyValue( "ConditionalFormat", oFC )
End Sub
Observa que ahora hemos usado la propiedad Formula1 y Formula2 para dar el intervalo de valores que nos interesa evaluar, entre 0 y 5, entre 6 y 8 y por ultimo entre 9 y 10, también observa que ahora, en vez de aplicar el formato condicional a una sola celda, lo hemos hecho a un rango de celdas, en este caso, “B1:B10”.
Donde realmente me parece, se ve la nobleza del formato condicional, es con el uso de formulas, pues nos da un margen muy amplio para establecer las condiciones, por ejemplo, supongamos que tenemos un rango de celdas con fechas y queremos que los sábados y domingos se distingan de los demás días, crea dos estilos de celda nuevos, uno para los sábados y otro para los domingos, creamos su formato condicional con el siguiente ejemplo.
Sub FormatoCondicional4()
Dim oDoc As Object
Dim oHojaActiva As Object
Dim oRango As Object
Dim oFC As Object
Dim mCondiciones(3) As New com.sun.star.beans.PropertyValue
oDoc = ThisComponent
oHojaActiva = oDoc.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( "I2:J32" )
'Accedemos al formato condicional
oFC = oRango.getPropertyValue("ConditionalFormat")
oFC.clear()
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "WEEKDAY(A1)=7"
mCondiciones(2).Name = "StyleName"
mCondiciones(2).Value = "Sabados"
oFC.addNew ( mCondiciones() )
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
mCondiciones(1).Name = "Formula1"
mCondiciones(1).Value = "WEEKDAY(A1)=1"
mCondiciones(2).Name = "StyleName"
mCondiciones(2).Value = "Domingos"
oFC.addNew ( mCondiciones() )
'Reestablecemos la propiedad para que surtan efecto
oRango.setPropertyValue( "ConditionalFormat", oFC )
End Sub
Observa como hemos establecido el valor (Value) de la propiedad Formula1, estamos haciendo uso de una función incorporada DIASEM (WEEKDAY) de Calc, que nos devuelve el día de la semana que corresponda a la fecha pasada como argumento; Domingo=1, Lunes=2, etc, nota como, al ser una función de Calc, si esta lleva argumentos, forzosamente hay que proporcionárselos, observa que nuestro rango empieza en I2 y a la función le estamos pasando la celda A1, no te confundas, le decimos que es la celda A1 por que la referencia es “relativa”, el valor que queremos evaluar, es el de la misma celda I2, I3, etc, el formato condicional, ajustará correctamente las referencias a cada celda, por supuesto, compruébalo.
Vamos a crear un formato condicional un poco más elaborado, pero más divertido. Observa el par de listas en la imagen siguiente.
La tarea, es hacer un formato condicional que nos resalte los meses que faltan en una y otra lista. Por supuesto, antes de ver la solución, trata de resolverlo por ti mismo, primero te muestro la imagen con el resultado, para que veas que es posible, después viene la macro con la solución que no tienes que ver hasta que intentes resolverlo, confío en ti. Observa como hemos satisfecho la condición, están resaltados con fondo gris, fuente azul y negritas, los meses que “no” están en cada lista, por supuesto, esto funciona con cualquier par de listas.
Ahora la solución.
Sub FormatoCondicional5()
Dim oDoc As Object
Dim oHojaActiva As Object
Dim oRango As Object
Dim oFC As Object
Dim mCondiciones(3) As New com.sun.star.beans.PropertyValue
oDoc = ThisComponent
oHojaActiva = oDoc.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( "B2:B9" )
oFC = oRango.getPropertyValue("ConditionalFormat")
oFC.clear()
'Condiciones para la primer lista
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
mCondiciones(1).Name = "Formula1"
'Observa como ahora usamos referencia absolutas
mCondiciones(1).Value = "COUNTIF($D$2:$D$9;A1)=0"
mCondiciones(2).Name = "StyleName"
mCondiciones(2).Value = "Faltante"
oFC.addNew ( mCondiciones() )
'Reestablecemos la propiedad para que surtan efecto
oRango.setPropertyValue( "ConditionalFormat", oFC )
'Para la segunda lista
oRango = oHojaActiva.getCellRangeByName( "D2:D9" )
oFC = oRango.getPropertyValue("ConditionalFormat")
oFC.clear()
mCondiciones(0).Name = "Operator"
mCondiciones(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
mCondiciones(1).Name = "Formula1"
'Observa como ahora usamos referencia absolutas
mCondiciones(1).Value = "COUNTIF($B$2:$B$9;A1)=0"
mCondiciones(2).Name = "StyleName"
mCondiciones(2).Value = "Faltante"
oFC.addNew ( mCondiciones() )
'Reestablecemos la propiedad para que surtan efecto
oRango.setPropertyValue( "ConditionalFormat", oFC )
End Sub
Y con esto terminamos el tema de los formatos, que, te habrás dado cuenta, muchas veces consume mucho más código que otras necesidades.
¡Feliz programación!
Si tienes dudas acerca de lo aquí explicado, tienes algún problema con AOO, o quieres ampliar la información, no dudes en dirigirte al Foro Oficial en español de Apache OpenOffice para Macros y API UNO |