Macros en OpenOffice o LibreOffice

El uso de macros en LibreOffice no resulta tan simple como en el paquete de Microsoft.

Una opción para los que no conocemos mucho de programación de macros (usando VBA o OpenOffice Basic) es grabar una macro, ejecutar los pasos para resolver el problema y modificar el código si fuera necesario.

Para grabar macros en OO, primero hay que habilitar la posibilidad de grabar macros desde el menú Herramientas ==> Opciones ==> Avanzado  y marcar la casilla “Activar la grabación de macros“. Así podemos iniciar la grabación desde Herramientas ==> Macros ==> Grabar Marco.

De todas formas debo decir que, al menos desde mi experiencia, la grabación de macros en OO no resulta tan optima en comparación con MS Office. Muchas cosas no pueden ser grabadas o bien el resultado de la grabación no produce el efecto deseado.

Como necesitaba arreglar unas planillas exportadas de SAP para el trabajo, donde tenemos LibreOffice, me dediqué a la búsqueda de un manual de referencia para OpenOffice Basic.

Buscando di con el manual que escribió Mauricio Baeza Servín, disponible en el repositorio del autor el cual me ayudó mucho en el proceso de construir las macros necesarias para el proceso. El manual resulta muy claro, bien estructurado y da varios ejemplos de usos prácticos y realistas.

Básicamente mi necesidad consistía en aplicar unos formatos, eliminar algunas filas y columnas, cortar y pegar algunos rangos de celdas, ordenar algunos datos y calcular unos subtotales.

También probé usar MS Office, pero comprobé que Excel es bastante “vidrioso” con el tema de tomar celdas con fechas en formato texto surgidas de otros sistemas, ordenarlas y filtrarlas (pueden quedar en cualquier orden).

A continuación les muestro el código de algunos ejemplos para lograr cosas más simples y rutinarias:

Cortar y pegar un rango de celdas:

' declaro las variables
Dim oHojaActiva as Object
Dim OrangoOrig as Object
Dim OrangoDest as Object
' hago referencia a la hoja activa
oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
'creamos dos variables con los rangos de origen y destino
oRangoOrig = oHojaActiva.getCellRangeByName( "A8:E11" )
oRangoDest = oHojaActiva.getCellRangeByName( "C1" )
'movemos el rango de origen al destino
oHojaActiva.moveRange( oRangoDest.getCellAddress(), oRangoOrig.getRangeAddress() )

Eliminar Filas y Columnas:

Las filas y columnas se cuentan desde 0 y para removeByIndex se indica la celda donde se comienza a eliminar y a continuación la cantidad de celdas a eliminar

' eliminar la columna D
oHojaActiva.getColumns.removeByIndex( 3, 1 )
' eliminar las filas 5 a 7
oHojaActiva.getRows.removeByIndex( 4, 3 )

Buscar y reemplazar texto en un rango:

oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
'Creo un descriptor de los reemplazos
oRD = oHojaActiva.createReplaceDescriptor
' texto a buscar y reemplazar
oRD.setSearchString( "," )
'texto que reemplaza al buscado
oRD.setReplaceString( "" )
rango.replaceAll( oRD )

Formatos de celdas:

oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( “A5:O5” )
oRango.HoriJustify = 2 ‘ centrado
oRango.CharWeight = 150 ‘ bold
oRango.getColumns.OptimalWidth = True
oRango = oHojaActiva.getCellRangeByName( “A5:A6” )
oRango.getColumns.Width = 2420 ‘ ancho de columna

Todos los formatos se rigen por constantes o valores numéricos, por lo que conviene consultar las tablas que figuran en el manual para lograr los resultados buscados.

Otras cosas son más específicas del trabajo que me tocó hacer, traté de poner los ejemplos más  generales.

5 pensamientos en “Macros en OpenOffice o LibreOffice

  1. hola! tengo una duda, tengo unas macro que exporte de excel y resulta que hay unos códigos que no me están funcionando en libre office.
    lo que hace la macro es buscar un dato que ingreso en un userform en una lista de clientes que tengo.
    El userform funciona pero al momento de ingresar la matricula del cliente, me tira el siguiente error:
    Error de ejecución de BASIC.
    ‘1’

    Type: com.sun.star.uno.RuntimeException
    Message: Range::Find, missing params

    El código es:

    Set busco = Sheets(“Cursos”).Range(“C:C”).Find(Dato, LookIn:=xlValues, lookat:=xlWhole)

    Lo que hace es encontrar donde está la matricula de la persona que busco dentro del rango C:C de la hoja Cursos.

    Espero puedan ayudarme!!! Gracias

    • Hola
      Lamentablemente no soy especialista en macros en LibreOffice. Sólo postee sobre esta experiencia que me vi obligado a realizar.
      Muchas veces las funciones de macros de MS Office cambian su nombre o comportamiento respecto a las de LibreOffice.
      Deberías realizar una búsqueda sobre las funciones Range y Find para macros en LibreOffice y Openoffice. Por lo visto está faltando completar un parámetro.
      No sé muy bien que tanto se llevará LibreOffice con xlValues y xlWhole dado que, supongo, debe ser algo más propio de MS Office.
      Lamentablemente no hay mucha y buena documentación de macros para LibreOffice, a excepción del manual de Mauricio Baeza Servín que figura en el post.
      Otra buena opción es la sección de Macros del foro de OpenOffice, podrías buscar / preguntar allí.
      De todas formas no te extrañe que alguien que conozca más del tema vea esto y pueda responder tu consulta.
      Un saludo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s