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 |