Formato de celdas

From Apache OpenOffice Wiki
Jump to: navigation, search


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

Primero las características de formato más usuales, tipo de fuente, tamaño, negritas, cursiva y subrayado.


 Sub FormatoCeldas1()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     With oSel
         'Tipo de letra
         .CharFontName = "Liberation Sans"
         'Tamaño de letra
         .CharHeight = 20
         'Negritas
         .CharWeight = 150
         'Cursiva o italica
         .CharPosture = 2
         'Subrayado
         .CharUnderline = 1
     End With
 
 End Sub


Para saber la lista completa de fuentes (CharFontName) que tienes disponibles en OpenOffice.org, usa las macros disponibles en: Listar fuentes en un archivo de Calc


El tamaño de la fuente (CharHeight) se establece en puntos, recordando que un punto es igual a 1/72 de pulgada, aproximadamente 0.3528 mm.


El estilo negritas se establece por cualquiera de las siguiente constantes, de las cuales, excepto los extremos, no hay muchas variantes entre ellas.


Constante Valor
com.sun.star.awt.FontWeight.DONTKNOW 0
com.sun.star.awt.FontWeight.THIN 50
com.sun.star.awt.FontWeight.ULTRALIGHT 60
com.sun.star.awt.FontWeight.LIGHT 75
com.sun.star.awt.FontWeight.SEMILIGHT 90
com.sun.star.awt.FontWeight.NORMAL 100
com.sun.star.awt.FontWeight.SEMIBOLD 110
com.sun.star.awt.FontWeight.BOLD 150
com.sun.star.awt.FontWeight.ULTRABOLD 175
com.sun.star.awt.FontWeight.BLACK 200


Al estilo cursiva o itálica le corresponden las siguiente constantes.


Constante Valor
com.sun.star.awt.FontSlant.NONE 0
com.sun.star.awt.FontSlant.OBLIQUE 1
com.sun.star.awt.FontSlant.ITALIC 2
com.sun.star.awt.FontSlant.DONTKNOW 3
com.sun.star.awt.FontSlant.REVERSE_OBLIQUE 4
com.sun.star.awt.FontSlant.REVERSE_ITALIC 5


El tipo de subrayado esta determinado por las constantes.


Constante Valor
com.sun.star.awt.FontUnderline.NONE 0
com.sun.star.awt.FontUnderline.SINGLE 1
com.sun.star.awt.FontUnderline.DOUBLE 2
com.sun.star.awt.FontUnderline.DOTTED 3
com.sun.star.awt.FontUnderline.DONTKNOW 4
com.sun.star.awt.FontUnderline.DASH 5
com.sun.star.awt.FontUnderline.LONGDASH 6
com.sun.star.awt.FontUnderline.DASHDOT 7
com.sun.star.awt.FontUnderline.DASHDOTDOT 8
com.sun.star.awt.FontUnderline.SMALLWAVE 9
com.sun.star.awt.FontUnderline.WAVE 10
com.sun.star.awt.FontUnderline.DOUBLEWAVE 11
com.sun.star.awt.FontUnderline.BOLD 12
com.sun.star.awt.FontUnderline.BOLDDOTTED 13
com.sun.star.awt.FontUnderline.BOLDDASH 14
com.sun.star.awt.FontUnderline.BOLDLONGDASH 15
com.sun.star.awt.FontUnderline.BOLDDASHDOT 16
com.sun.star.awt.FontUnderline.BOLDDASHDOTDOT 17
com.sun.star.awt.FontUnderline.BOLDWAVE 18


Recuerda que puedes usar tanto las constantes como el valor de estas, según tu gusto y criterio. Algunos de los valores de estas constantes, los puedes establecer pero no veras ningún efecto aparente.


Algunas otras opciones de formato de fuente son.


 Sub FormatoCeldas2()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     With oSel
         'Espacios sin subrayar
         .CharWordMode = True
         'Tachado de fuente
         .CharCrossedOut = True
         'Contorno de fuente
         .CharContoured = True
     End With
 
 End Sub


Cuando se subraya la fuente y la propiedad CharWordMode se establece en verdadera (True), te deja los espacios entre palabras sin subrayar. Las otras dos propiedades creo que son bastante autoexplicativas.


Ahora, veamos algo muy divertido, el color, establezcamos el color de la fuente y del subrayado de esta.


 Sub FormatoCeldas3()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     With oSel
         'Color de la fuente azul
         .CharColor = RGB( 0,0,255 )
         'Estilo de subrayado
         .CharUnderline = 1
         'Color de subrayado rojo
         .CharUnderlineColor = RGB(255,0,0,)
         'Si se muestra el color
         .CharUnderlineHasColor = True
     End With
 
 End Sub


Con la propiedad CharColor y la ayuda de la función RGB, establecemos el color de la fuente, para el subrayado, primero establecemos el estilo (CharUnderline), después el color de este (CharUnderlineColor) y por ultimo establecemos si queremos que se muestre el color (CharUnderlineHasColor), si esta propiedad se establece en falso (false), el color del subrayado será del mismo color que el de la fuente.


Con la siguiente macro, a cada celda del rango seleccionado se le establecerá un color de fuente y de subrayado aleatorio.


 Sub FormatoCeldas4()
 Dim oSel As Object
 Dim col As Long
 Dim fil As Long
 
     oSel = ThisComponent.getCurrentSelection()
 
     If oSel.getImplementationName = "ScCellRangeObj" Then
         With oSel
             For col = 0 To oSel.getColumns.getCount - 1
                 For fil = 0 To oSel.getRows.getCount - 1
                     With .getCellByPosition( col, fil )
                         .CharColor = RGB( Rnd()*255,Rnd()*255,Rnd()*255 )
                         .CharUnderline = 1
                         .CharUnderlineColor = RGB( Rnd()*255,Rnd()*255,Rnd()*255)
                         .CharUnderlineHasColor = True
                     End With
                 Next
             Next
         End With
     End If
 
 End Sub


La alineación del contenido de la celda, se establece con las propiedades VertJustify para el sentido vertical y HoriJustify para el sentido horizontal de la siguiente forma.


 Sub FormatoCeldas5()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     'Alineamos en medio verticalmente
     oSel.VertJustify = 2
     'Alineamos centrado horizontalmente
     oSel.HoriJustify = 2
 
 End Sub


Los valores posibles para cada propiedad son:


Propiedad VertJustify Valor
com.sun.star.table.CellVertJustify.STANDARD 0
com.sun.star.table.CellVertJustify.TOP 1
com.sun.star.table.CellVertJustify.CENTER 2
com.sun.star.table.CellVertJustify.BOTTOM 3


Propiedad HoriJustify Valor
com.sun.star.table.CellHoriJustify.STANDARD 0
com.sun.star.table.CellHoriJustify.LEFT 1
com.sun.star.table.CellHoriJustify.CENTER 2
com.sun.star.table.CellHoriJustify.RIGHT 3
com.sun.star.table.CellHoriJustify.BLOCK 4
com.sun.star.table.CellHoriJustify.REPEAT 5


Con la combinación de estos valores, tenemos muchas posibilidades de alineación de una celda. La constante com.sun.star.table.CellHoriJustify.REPEAT, es muy interesante por que te repite el valor de la celda hasta llenar el ancho de ella, prueba a establecer esta propiedad en una celda cuyo contenido sea un punto para que notes su comportamiento.


Si queremos ajustar el texto automáticamente en la celda, usamos.


 Sub FormatoCeldas6()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Ajuste de texto
     oSel.IsTextWrapped = True
 
 End Sub


Si queremos reducir el texto hasta que quepa en la celda, usamos.


 Sub FormatoCeldas7()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Reducción de texto
     oSel.ShrinkToFit =True
 
 End Sub


Si queremos cambiar la orientación del texto.


 Sub FormatoCeldas8()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Orientacion vertical del texto
     oSel.Orientation = 3
 
 End Sub


Los valores para esta propiedad son:


Propiedad Orientation Valor
com.sun.star.table.CellOrientation.STANDARD 0
com.sun.star.table.CellOrientation.TOPBOTTOM 1
com.sun.star.table.CellOrientation.BOTTOMTOP 2
com.sun.star.table.CellOrientation.STACKED 3


O podemos establecer el ángulo de rotación.


 Sub FormatoCeldas9()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     oSel.RotateAngle = 9000
 
 End Sub


El valor del ángulo esta dado en centésimas de ángulo, es decir, en el ejemplo anterior establecemos el ángulo en 90º (9000) para 180º podemos 18000 y así sucesivamente.


Toma en cuenta que algunas de las propiedades vistas hasta ahora, se autoexcluyen mutuamente, por lo que tienes que asegurarte que no se contraponen, de los dos ejemplos siguiente, solo el segundo es correcto.


 Sub FormatoCeldas10()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     oSel.HoriJustify = 2
     oSel.IsTextWrapped = True
     'Tamaño de sangría
     oSel.ParaIndent = 1000
 
 End Sub
 
 Sub FormatoCeldas11()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     oSel.HoriJustify = 1
     oSel.IsTextWrapped = True
     'Tamaño de sangría
     oSel.ParaIndent = 1000
 
 End Sub


También podemos establecer el color de fondo de las celdas.


 Sub FormatoCeldas12()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Color del fondo de la celda (gris)
     oSel.CellBackColor = RGB(200,200,200)
 
 End Sub


La siguiente macro te colorea cada celda de la selección, tanto la fuente como el fondo de la celda de un color aleatorio:


 Sub FormatoCeldas13()
 Dim oSel As Object
 Dim col As Long
 Dim fil As Long
 
     oSel = ThisComponent.getCurrentSelection()
 
     If oSel.getImplementationName = "ScCellRangeObj" Then
         With oSel
             For col = 0 To oSel.getColumns.getCount - 1
                 For fil = 0 To oSel.getRows.getCount - 1
                     With .getCellByPosition( col, fil )
                         .CharColor = RGB( Rnd()*255,Rnd()*255,Rnd()*255 )
                         .CellBackColor = RGB( Rnd()*255,Rnd()*255,Rnd()*255 )
                     End With
                 Next
             Next
         End With
     End If
 
 End Sub


Los bordes de las celdas tienen muchas posibilidades, veamos algunas.


 Sub FormatoCeldas14()
 Dim oSel As Object
 Dim oBordeLinea As New com.sun.star.table.BorderLine
 
     oSel = ThisComponent.getCurrentSelection()
 
     'Establecemos las características de la linea
     With oBordeLinea
         'El color (rojo)
         .Color = RGB(255,0,0)
         'El ancho de la linea exterior
         .InnerLineWidth = 50
         'El ancho de la linea interior
         .OuterLineWidth = 50
         'La distancia entre las lineas
         .LineDistance = 20
     End With
 
     'Establecemos los bordes
     With oSel
         .TopBorder = oBordeLinea        'Superior
         .BottomBorder = oBordeLinea        'Inferior
         .LeftBorder = oBordeLinea        'Izquierdo
         .RightBorder = oBordeLinea        'Derecho
     End With
 
 End Sub


El ancho de las lineas y la distancia entre ellas esta dada en centésimas de milímetros, si establecemos solo una de las dos líneas, veras una linea simple. Si deseas establecer también las líneas diagonales, usa la propiedad DiagonalTLBR para la línea que va desde la esquina superior izquierda a la inferior derecha y DiagonalBLTR para la que va de la esquina inferior izquierda a la superior derecha, tienes que establecerles la misma estructura de línea (com.sun.star.table.BorderLine) vista en los ejemplos.


El código anterior te establecerá el borde de cada celda del rango seleccionado, si quieres establecer el borde de solo los extremos del rango, tiene que usar la estructura TableBorder.


 Sub FormatoCeldas15()
 Dim oSel As Object
 Dim oBordeLinea As New com.sun.star.table.BorderLine
 Dim oBordeTabla As New com.sun.star.table.TableBorder
 
     oSel = ThisComponent.getCurrentSelection()
 
     'Establecemos las características de la linea
     With oBordeLinea
         'El color (azul)
         .Color = RGB(0,0,255)
         'El ancho de la linea interior
         .OuterLineWidth = 75
     End With
 
     'Establecemos las características de la tabla
     With oBordeTabla
         .TopLine = oBordeLinea            'Superior
         .IsTopLineValid = True
         .BottomLine = oBordeLinea        'Inferior
         .IsBottomLineValid = True
         .LeftLine = oBordeLinea        'Izquierdo
         .IsLeftLineValid = True
         .RightLine = oBordeLinea        'Derecho
         .IsRightLineValid = True
     End With
 
     'Establecemos los bordes
     oSel.TableBorder = oBordeTabla
 
 End Sub


Las propiedades IsTopLineValid, IsBottomLineValid, IsLeftLineValid y IsRightLineValid, tienes que establecerlas en verdadero (true) si quieres que se vea la línea.


Para establecer los margenes de la celda, usamos.


 Sub FormatoCeldas16()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
 
     'Para establecer los margenes de la celda
     With oSel
         .ParaTopMargin = 500            'Arriba
         .ParaBottomMargin = 500        'Abajo
         .ParaLeftMargin = 800        'Izquierda
         .ParaRightMargin = 800        'Derecha
     End With
 
 End Sub


Para dar un formato predeterminado a la celda, usamos la propiedad NumerFormat, la cual es necesario establecer como un entero largo (long) correspondiente a la clave del formato que nos interese, por ejemplo.


 Sub FormatoCeldas17()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Establecemos la selección en el formato Estándar
     oSel.NumberFormat = 0
 
 End Sub


El numero de clave no es secuencial, por lo que tenemos que saber de antemano la clave del formato que nos interesa, para ello, usa la macro que te muestro en: [#11.7.Listar formatos en un archivo de Calc|outline Listar formatos en un archivo de Calc].


Ahora veamos como combinar y separar celdas. Para ello, usamos el método merge, con el argumento verdadero (true), como en el siguiente ejemplo.


 Sub FormatoCeldas18()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Combinamos las celdas seleccionadas
     oSel.merge( True )
 
 End Sub


Este método solo esta presente en un rango de celdas, no en una colección de rangos así que validalo cuando lo uses. Si estableces el argumento en falso (false), separara las celdas de la selección. Este método es sencillo pero debes de tomar en cuenta algunas consideraciones. Si seleccionas un rango ya combinado, junto con un área que no, este método no hará nada, claro, por código estoy hablando, pero has la prueba en la interfaz del usuario, es decir, manualmente y observa que pasa, ahora, tratemos de emularlo con código.


 Sub FormatoCeldas19()
 Dim oSel As Object
 
     oSel = ThisComponent.getCurrentSelection()
     'Separamos las celdas seleccionadas
     oSel.merge( False )
     'Las combinamos
     oSel.merge( True )
 
 End Sub


Si se puede, ¿verdad?, primero las separamos y después las combinamos. La siguiente consideración que debes tomar en cuenta, es saber que pasa cuando las celdas se combinan, para ello, haremos unas pruebas ya no con la selección sino con rangos con nombre, la macro siguiente te alternara entre combinar y separar la el rango seleccionado, nota como consultamos la propiedad getIsMerged para saber si el rango esta combinado.


 Sub FormatoCeldas20()
 Dim oRango As Object
 Dim oHojaActiva As Object
 
     oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
 
     oRango = oHojaActiva.getCellRangeByName( "B2:D10" )
 
     'Invertimos la combinación
     oRango.merge( Not oRango.getIsMerged )
 
 End Sub


Ahora, en la siguiente macro, tienes que poner mucha atención, nota el rango que estamos combinando, las celdas en las cuales verificamos si están combinadas, el valor que nos devuelve el consultar su propiedad getIsMerged y observa hasta cuando nos funciona el método para separar las celdas.


 Sub FormatoCeldas21()
 Dim oRango As Object
 Dim oHojaActiva As Object
 
     oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
     oRango = oHojaActiva.getCellRangeByName( "E15:H20" )
     oRango.merge( True )
 
     'Nota que la celda G19 forma parte del rango combinado
     'consultamos la propiedad y tratamos de separar
     Msgbox oHojaActiva.getCellRangeByName( "G19" ).getIsMerged()
     oHojaActiva.getCellRangeByName( "G19" ).merge( False )
 
     Msgbox oHojaActiva.getCellRangeByName( "F17" ).getIsMerged()
     'Tratamos de separar las celdas
     oHojaActiva.getCellRangeByName( "G19" ).merge( False )
 
     Msgbox oHojaActiva.getCellRangeByName( "E16" ).getIsMerged()
     oHojaActiva.getCellRangeByName( "G19" ).merge( False )
 
     'Ahora si, nos dice que esta combinada y
     'finalmente logramos separarlas 
     Msgbox oHojaActiva.getCellRangeByName( "E15" ).getIsMerged()
     oHojaActiva.getCellRangeByName( "E15" ).merge( False )
 
 End Sub


¿Lo notaste?, cuando se combinan celdas, todas, excepto la de la esquina superior izquierda del rango, se marcan como “no” combinadas, entonces, eso nos obliga a buscar y encontrar esta celda a partir de otra cuando intentemos separar celdas, para hacer esto, nos auxiliaremos de un cursor cuyo uso ya lo hemos visto.


 Sub FormatoCeldas22()
 Dim oRango As Object
 Dim oHojaActiva As Object
 Dim oCursor As Object
 
     oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
     oRango = oHojaActiva.getCellRangeByName( "E15:H20" )
     oRango.merge( True )
 
     'Verificamos que este combinada
     MsgBox oHojaActiva.getCellRangeByName( "E15" ).getIsMerged()
 
     'Creamos un cursor a partir de una celda que no sea la de
     'la esquina superior izquierda
     oCursor = oHojaActiva.createCursorByRange( oHojaActiva.getCellRangeByName( "G19" ) )
     'Expandimos el cursor al área combinada
     oCursor.collapseToMergedArea()
     'Separamos las celdas
     oCursor.merge( False )
 
 End Sub


Esta vez, a partir de otra celda, expandimos el cursor a la región combinada y pudimos separar fácilmente. Toma en cuenta que pasa con las celdas que tienen contenido cuando se combinan, verificalo en la interfaz del usuario y trata de anticipar este caso.


Como ultimo tema de este capitulo, veamos como proteger y desproteger celdas, recuerda que esta protección solo es efectiva si la hoja de calculo esta protegida.


 Sub ProtegerCeldas1()
 Dim oRango As Object
 Dim oHojaActiva As Object
 Dim oPC As New "com.sun.star.util.CellProtection"
 
     oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
     oRango = oHojaActiva.getCellRangeByName( "J27:L30" )
 
     With oPC
         'Determina si la celda esta bloqueada para modificarse
         .IsLocked = True
         'Determina si se ocultan las formulas, solo veras el resultado
         .IsFormulaHidden = True
         'Determina si se oculta el contenido de las celdas
         .IsHidden = True
         'Para ocultar solo para la impresión
         .IsPrintHidden = True
     End With
     oRango.CellProtection = oPC
     oHojaActiva.Protect("")
 
 End Sub


Para desproteger las celdas, es suficiente con desproteger la hoja, de todos modos puedes deshabilitar las opciones de protección con solo establecer las opciones de protección en falso (False), por supuesto, no siempre tienen que estar todas seleccionadas, tu determinaras el nivel de acceso en cada uno de tus proyecto, por ejemplo.


 Sub ProtegerCeldas2()
 Dim oRango As Object
 Dim oHojaActiva As Object
 Dim oPC As New "com.sun.star.util.CellProtection"
 
     oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
     oRango = oHojaActiva.getCellRangeByName( "J27:L30" )
     'Desprotegemos la hoja
     oHojaActiva.unProtect("")
     With oPC
         'Determina si la celda esta bloqueada para modificarse
         .IsLocked = True
         'Determina si se ocultan las formulas, solo veras el resultado
         .IsFormulaHidden = True
         'Determina si se oculta el contenido de las celdas
         .IsHidden = True
         'Para ocultar solo para la impresión
         .IsPrintHidden = True
     End With
     oRango.CellProtection = oPC
 
 End Sub



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