Conceptos básicos
El directorio o carpeta de trabajo es el espacio de memoria de nuestro ordenador en el que se encuentran los archivos con los que estamos trabajando y donde R los buscará para cargarlos y grabarlos.
Sub Main
Dim oHoja As ObjectoHoja = ThisComponent.getSheets.getByIndex(1)oHoja.isVisible = TrueWait 500oHoja = ThisComponent.getSheets.getByIndex(0)oHoja.isVisible = FalseWait 500oHoja = ThisComponent.getSheets.getByIndex(2)oHoja.isVisible = TrueWait 500oHoja = ThisComponent.getSheets.getByIndex(1)oHoja.isVisible = FalseWait 500oHoja = ThisComponent.getSheets.getByIndex(3)oHoja.isVisible = TrueWait 500oHoja = ThisComponent.getSheets.getByIndex(2)oHoja.isVisible = False
End Sub
Sub Ir_Hoja2Nombre ' Por el nombreDim DocCalc As ObjectDim Hoja As ObjectDocCalc = ThisComponentHoja = DocCalc.getSheets().getByName("Hoja2")DocCalc.CurrentController().SetActiveSheet(Hoja)End Sub
Sub PruebaFuncionCalc1a
Dim oHoja As ObjectDim dResulta As DoubleoHoja = ThisComponent.CurrentController.ActiveSheetoHoja.getCellRangeByName("B12").Formula = "=SUM(A1:A12)"dResulta = oHoja.getCellRangeByName("B12").ValueMsgBox dResulta
End Sub
Tras declarar dos variables (oHoja y dResulta) y acceder al objeto Hoja (oHoja = ThisComponent.CurrentController.ActiveSheet), implementamos la fórmula (=SUM(A1:A12)) en la celda B12. Para ello añadimos al identificador de la celda el identificador Formula (oHoja.getCellRangeByName("B12").Formula = "=SUM(A1:A12)")
Una vez que la fórmula actúa y entrega su resultado en la celda establecida, accedemos a dicho resultado asignándolo a la variable dResulta (dResulta = oHoja.getCellRangeByName("B12").Value) (5). En este caso, lo que hacemos con el valor obtenido es mostrarlo mediante MsgBox (MsgBox dResulta), pero podríamos utilizarlo de cualquier otra forma, dependiendo del algoritmo de nuestro script.
Sub PruebaFuncionCalc2
Dim oHoja As ObjectDim dSuma As DoubleoHoja = ThisComponent.getSheets().getByName("Hoja1")dSuma = FuncionCalc( "SUM", Array(oHoja.getCellRangeByName("A1:A12")) )MsgBox dSuma
End Sub
Tras declarar las dos variables necesarias (oHoja y dSuma) y acceder al objeto Hoja (oHoja = ThisComponent.getSheets().getByName("Hoja1")) recurrimos a la función (FuncionCalc()), asignando el dato que devuelve ésta a la variable dSuma. Dado que se trata de una función, cuenta (en este caso) con dos parámetros, que son los que pasamos por valor en la formulación de la llamada a la función (FuncionCalc( "SUM", Array(oHoja.getCellRangeByName("A1:A12")) )):
- El primero es el nombre de la función Calc (en inglés) ("SUM")
- Y el segundo, mucho más complejo, es la matriz de datos formada por el contenido del conjunto de celdas A1:A12, esto es: los datos que requiere la función Calc (Array(oHoja.getCellRangeByName("A1:A12"))) (6)
Después utilizamos el resultado devuelto por la función para mostrarlo en pantalla mediante MsgBox (MsgBox dSuma) (7)
Veamos a continuación el código de la función FuncionCalc():
Function FuncionCalc( Nombre As String, Datos() )
Dim oSFA As Object
oSFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
FuncionCalc = oSFA.callFunction( Nombre, Datos() )
End Function
Observa que la función tiene dos parámetros, uno de tipo texto y otro una matriz (Nombre As String, Datos()): son los mismos a los que damos valor desde el script (( "SUM", Array(oHoja.getCellRangeByName("A1:A12")))).
Además, la función cuenta con una variable de tipo objeto (oSFA) a la que se asigna el objeto UnoService de acceso a las funciones de Calc FunctionAccess. (createUnoService( "com.sun.star.sheet.FunctionAccess")) Esta asignación se basa en la estructura típica de acceso a las funciones nucleares de la suite LibreOffice, que, como sabes, está escrita en parte en Java, esto es: en un lenguaje orientado a objetos (POO)
Siguiendo la sintaxis de las funciones, asignamos al identificador de la actual el resultado de aplicar la función nombrada a la matriz de datos; como recordarás, ambos han sido pasados por valor desde el scriot (FuncionCalc = oSFA.callFunction(Nombre, Datos())). De este modo la función devuelve al script, el resultado de dicha función. (8)
Sub PruebaFuncionCalc1b
Dim oHoja As ObjectDim sResulta As DoubleoHoja = ThisComponent.CurrentController.ActiveSheetoHoja.getCellRangeByName("B15").Formula = "=SQRT(A15)"dResulta = oHoja.getCellRangeByName("B15").ValueMsgBox dResulta
End Sub
Como ves hay poco que añadir a lo visto en la explicación del script de base (PruebaFuncionCalc1a): únicamente sustituimos la expresión de la función anterior (SUM()) por la actual (SQRT()) (en inglés), con lo que no tienes mayor dificultad que recurrir al Asistente para funciones de Calc y traducir el nombre de la función al inglés. Los cambios de parámetros van incluidos en el procedimiento: para SUM() era necesaria una matriz de datos ("=SUM(A1:A12)") y para SQRT() únicamente una referencia a celda ("=SQRT(A15)")
El script PruebaFuncionCalc1c muestra la validez universal del procedimiento de sustitución que te acabo de explicar:
Sub PruebaFuncionCalc1c
Dim oHoja As ObjectDim sResulta As StringoHoja = ThisComponent.CurrentController.ActiveSheetoHoja.getCellRangeByName("B20").Formula = "=CONCATENATE(A20;A21;A22)"dResulta = oHoja.getCellRangeByName("B20").StringMsgBox dResulta
End Sub
De nuevo, es suficiente con escribir la sintaxis de la función Calc en la posición adecuada dentro del script para obtener el resultado deseado.
Pero aun hay más: podemos combinar varias funciones dentro de la misma expresión, del mismo modo que es posible construir una combinación de funciones Calc. El script PruebaFuncionCalc1d es una prueba de ello.
Sub PruebaFuncionCalc1d
Dim oHoja As ObjectDim dResulta As DoubleoHoja = ThisComponent.CurrentController.ActiveSheet
oHoja.getCellRangeByName("B13").Formula = "=SQRT(SUM(A1:A12))"
dResulta = oHoja.getCellRangeByName("B13").Value
MsgBox dResulta
End Sub
Aquí combinamos las funciones SQRT() y SUM() para obtener una función combinada en la que sobre la suma resultante de la matriz de datos A1:A12 solicitamos el cálculo de su raíz cuadrada ("=SQRT(SUM(A1:A12))"). El resultado se escribe en la celda B13. Como puedes comprobar, la sintaxis de la instrucción únicamente varía en la forma en que se llaman a ambas funciones, que es la misma que escribimos sobre la Línea de entrada de fórmulas de Calc.
Por tanto resulta evidente la ventaja de este modo de implementar funciones Calc en los script OOo Basic: es suficiente con escribir la fórmula según su sintaxis Calc, sustituyendo el nombre de la función por su equivalente en inglés. Es además importante establecer correctamente la referencia a los datos con los que trabajarán dichas funciones.
Documentos.
Pongo a tu disposición dos documento. El primero [FormulCalc.ods] es el documento Calc en el que puedes encontrar los ejemplos explicados en la entrada. El segundo [WIKI de OpenOffice] el enlace a la web donde encontrarás el listado de funciones Calc en inglés y en español.
REM ***** BASIC *****Sub MainEnd Sub
Sub Mainprint "OOo Basic para orientadores"End Sub
Parece lógico empezar por explicar estos procedimientos con las herramientas disponibles desde el propio procesador de textos (en nuestro caso Writer), ya que es la herramienta a la que estamos acostumbrados y porque el paso de Grabar macro a la escritura de script desde el IDE del propio servicio nos permite avanzar mucho en este aprendizaje sin necesidad de hacer uso de otros lenguajes. De hecho podríamos limitarnos a usar OOo Basic como única herramienta para automatizar la composición de texto, sin más complicación, pero hacerlo nos limita para el desarrollo de otros aspectos de la competencia digital, así que no es nuestra opción.
Así que, como hay que ir por partes y, a ser posible, que el avance tenga su lógica, inicio esta sección exponiendo diferentes formas de "trabajar" con textos y en la automatización de su composición con las herramientas más básicas y accesibles: macros y script OOo Basic.
Veremos en primer lugar y como prolongación de lo visto en la sección anterior y primera del capítulo Usos, cómo combinar el uso de macros y OOo Basic para desarrollar este proceso de automatización. Hay más que escritura en este proceso, así que también trataremos sobre el establecimiento de formatos y el desplazamiento por el documento. Precisamente en ambos, la combinación de macros y script resulta muy beneficiosa en términos de facilidad de creación de código y simplicidad de uso.
Pasaremos después a trabajar exclusivamente con OOo Basic en cuanto cuenta con alternativas diferenciadas en la funcionalidad Grabar macro para el manejo y la escritura de textos.
Finalmente nos enfrentaremos a tareas específicas, que derivan de las "imposiciones" formales y de formato de algunos textos con los que tenemos que trabajar como documento-base (un ejemplo de ello, los modelos de informe o de dictamen, pero hay más) y abordaremos el modo de cumplimentar "campos" de contenido en ellos.
Además de escribir textos, es frecuente que los documentos contengan también tablas, por lo que resulta de interés saber cómo crearlas y cumplimentarlas, así cómo realizar desplazamientos por ellas de forma automatizada.