Formato condicional

From Apache OpenOffice Wiki
Jump to: navigation, search


Editing.png Esta página está en estado borrador.

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.


ES StarBasic Calc EstilosAutoformato.05.png


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.


ES StarBasic Calc EstilosAutoformato.04.png


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.


ES StarBasic Calc EstilosAutoformato.03.png


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!



ES.Plantillas.Logo foro es.png
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

Personal tools