martes, 3 de diciembre de 2024
Documentos. LibreOffice
lunes, 15 de julio de 2024
Procedimientos. Macros.
Vincular macros o script a un objeto (2)
El documento Calc que ejemplifica este proceso consta de dos hojas: en la primera he implementado una figura y en la segunda una imagen. Los script (podemos decir, de ida y vuelta) permiten acceder uno a Hoja2 y otro a Hoja1. De este modo, al hacer clic en el cuadrado azul (Hoja1) nos desplazamos a Hoja2 (previamente se muestra esta hoja y después se oculta Hoja1). El proceso que desarrolla el script asociado a la imagen situada en Hoja2 realiza el proceso contrario.
Procedimientos. Macros.
Vincular macros o script a un objeto (1)
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
sábado, 13 de julio de 2024
Procedimientos. Datos
Ocultar hojas mediante macro
También podemos ocultar una hoja mediante una macro que oculta la hoja activa (2). Es muy sencilla; te la muestro a continuación:
Sub OcultarHoja
dim document as objectdim dispatcher as objectdocument = ThisComponent.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")dispatcher.executeDispatch(document, ".uno:Hide", "", 0, Array())
End Sub
No explico las cuatro primeras líneas por ser sobradamente conocidas, así que la tarea se simplifica aun más: la función dispatcher.executeDispatch() lanza la orden ".uno:Hide" sobre el objeto asignado a la variable document. Dicha orden consiste en atribuir al objeto el atributo "Oculto" (Hide), lo que equivale al uso del submenú Hoja | Ocultar hoja. Proceso finalizado (3)
Procedimientos. Datos
Macro para desplazarse por las hojas
Una vez [creada la macro] según lo que ya sabemos toca estudiarla para sacar de ella todo el rendimiento posible.
Sub macroIrHoja2
dim document as objectdim dispatcher as objectdocument = ThisComponent.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")dim args1(0) as new com.sun.star.beans.PropertyValueargs1(0).Name = "Nr"args1(0).Value = 2dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
End Sub
Una ver eliminados los comentarios sobradamente conocidos, y en su sustitución, paso a explicar el funcionamiento de esta macro. El objetivo que se persigue con ella es desplazar a la hoja llamada "Hoja2", por lo que se supone que nos encontramos en otra hoja diferentes (1)
Apreciamos, en primer lugar, la sintaxis común a todas la macros:
- La declaración de las variables objeto document y dispatcher, y la asignación de esos objetos a las variables:
document = ThisComponent.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
- Observamos que la matriz args1(0) cuenta con dos dimensiones (Name y Value) (2): el primero toma el valor "Nr" que identifica que trabajaremos con el número de la hoja y el segundo, Value (valor) al que se asigna el dato (integer) concreto (2) (3)
- Finalmente, el ejecutor de la macro (dispatcher.executeDispatch) nos muestra la instrucción que ejecuta la orden de saltar a la hoja señalada en args1(0).Value (".uno:JumpToTable") (4)
Sub IrHoja2 'Script
MovHoja (2)
End SubSub MovHoja (iH As Integer) 'Subrutina
dim document as objectdim dispatcher as objectdocument = ThisComponent.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")dim args1(0) as new com.sun.star.beans.PropertyValueargs1(0).Name = "Nr"args1(0).Value = iHdispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
End sub
NOTAS
(2) Como puedes ver, hasta ahora nada de especial en cuanto a la sintaxis de una macro
(3) Esto ya nos da una pista de cómo podemos manipular esta macro mediante OOo Basic.
(4) En el lenguaje macro, las hojas se asimilan a tablas, de ahí la instrucción JumpToTable.
(5) Aunque no es la única opción; y menos aun si sólo vas a trabajar con una macro.
(6) Fíjate que en el caso de las macros, el índice de la hoja coincide con su orden numérico observable: la primera es 1, no 0. Esto no es así en un script o una subrutina creado directamente en OOo Basic, ya que en él la matriz de hojas del libro se inicia con el valor 0.
(7) Con lo que, como sabes, se está asignando el valor establecido en el script en la llamada a la subrutina.
viernes, 26 de abril de 2024
OOo Basic. Datos
Variables
Después de investigar unos cuantos expedientes y una vez que se hace idea de cómo abordar el tema, Mercedes se plantea crear un documento-modelo para recoger toda la información. Hace un informe a modo de "ejemplo" y, después de revisarlo y reajustarlo, se plantea utilizarlo como base para construir los restantes.
Juan es actualmente alumno de 4º de E. Primaria en el C.P. Aurelia Sánchez (Santullano)
Luis es actualmente alumno de 2º de E. Primaria en el C.P. Aurelia Sánchez (Santullano)
Comparemos ambos textos:
- Observamos que varían dos datos: el nombre del alumno y el curso.
- El resto permanece igual
- Herramientas | Macros | Editar macros.
- Si no estamos ya en nuestro documento, Biblioteca Standard, Módule1 (por ejemplo), repetimos la selección que implica llegar hasta aquí...
- Y nos encontramos con el código siguiente:
sub InfoEscolar1rem ----------------------------------------------------------------------rem define variablesdim document as objectdim dispatcher as objectrem ----------------------------------------------------------------------rem get access to the documentdocument = ThisComponent.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")rem ----------------------------------------------------------------------dim args1(0) as new com.sun.star.beans.PropertyValueargs1(0).Name = "Text"args1(0).Value = "Juan es actualmente alumno de 4º de E. Primaria del C.P. Aurelia Sánchez (Santullano)"dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())end subsub InfoEscolar2rem ----------------------------------------------------------------------rem define variablesdim document as objectdim dispatcher as objectrem ----------------------------------------------------------------------rem get access to the documentdocument = ThisComponent.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")rem ----------------------------------------------------------------------dim args1(0) as new com.sun.star.beans.PropertyValueargs1(0).Name = "Text"args1(0).Value = "Luis es actualmente alumno de 2º de E. Primaria del C.P. Aurelia Sánchez (Santullano)"dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())end sub
- A continuación de la expresión dim dispatcher as object vamos a crear una línea en blanco (Intro) (en realidad dos líneas).
- Y escribimos Dim sNombre As String en la primera y Dim sCurso As String en la segunda (3). Ya tenemos creadas nuestras variables.
- A continuación buscamos línea...
args1(0).Value = "Juan es actualmente alumno de 4º de E. Primaria del C.P. Aurelia Sánchez (Santullano)"
- Y sustituimos "Juan es actualmente alumno de 4º de E. Primaria del C.P. Aurelia Sánchez (Santullano)" por sNombre & " es actualmente alumno de " & sCurso & " de E. Primaria del C.P. Aurelia Sánchez (Santullano)" (es importante respetar el uso de las comillas y los espacios iniciales)
- A continuación de Dim sCurso As String generamos un salto de línea (mejor dos para que el código sea más visible) y escribimos estas dos líneas:
sNombre = "Juan"
sCurso = "4º"
Con ellas estamos diciendo a OOo Basic que almacene en el espacio de memoria RAM identificado como sNombre el dato "Juan", de modo que cuando aparezca la expresión sNombre acceda a ese espacio de memoria, recupere su contenido (el dato "Juan" en este caso) y haga con él lo que corresponda (en nuestra "macro" escribir Juan antes de la cadena " es actualmente..."). Y lo mismo con sCurso.
Usar este procedimiento no es la mejor opción posible, ya que obliga a Mercedes a acceder al IDE y realizar las asignaciones pertinentes para cada informe, así que mejor buscamos otra solución más funcional: usaremos la función OOo Basic llamada InputBox(), asociándola a cada una de las variables. Vemos cómo:
- Sustituimos sNombre = "Juan" por sNombre = InputBox("Nombre del alumno"
- Y hacemos lo mismo con sCurso
- Hemos accedido a una macro e identificado en ella la información que nos interesa.
- Hemos aprendido a crear (declarar) y usar (asignar valor y sustituir el dato concreto por la variable) variables.
- Y hemos automatizado y generalizado la creación de un documento combinando una macro con unas variables, lo que equivale a decir que hemos aprendido (de momento empezado a aprender) cómo superar las limitaciones de las macros mediante su tratamiento con OOo Basic.
- Además hemos utilizado una función que facilita la fase Input del proceso básico de un script (Input - Procesamiento - Output) (4)
jueves, 25 de abril de 2024
OOo Basic
Primero, las macros.
El lenguaje OOo Basic se anuncia como lenguaje de macros, pero aunque esta consideración sea correcta en el sentido amplio que se da al término "macro", en sentido estricto y también práctico, puede dar lugar a confusión y conlleva un reduccionismo que afecta negativamente a la valoración de la potencialidad que tiene el conocimiento del lenguaje.
- Activamos la opción Herramientas | Opciones.
- Dentro de las que se nos ofrecen activamos LibreOffice | Avanzado
- Y en Opciones Java (a la derecha del menú anterior) encontramos Funcionalidades opcionales.
- La funcionalidad Activar grabación de macros (limitada) se encontrará no seleccionada.
- La seleccionaremos (clic en el check list correspondiente) y haremos clic en Aplicar y en Aceptar para cerrar la ventana del menú.
... en cuyo botón Finalizar grabación deberemos hacer clic cuando hayamos finalizado la secuencia de acciones que queremos automatizar. Lo que obtenemos como resultado es algo que resulta ciertamente confuso al no iniciado: visualizamos sin saberlo un acceso temporal al IDE, pero si no sabemos nada de su existencia es fácil que nuestra macro termine perdida sin que sepamos cómo acceder a ella cuando la necesitamos. Es necesario, por tanto, comprender el proceso a seguir.
- Volvemos al menú Herramientas | Opciones
- Seleccionamos ahora Seguridad y (a la derecha) hacemos clic en Seguridad de macros.
- Se activa una ventana emergente que nos da cuatro opciones.
- Personalmente opto por Medio, por el control que me da sobre la activación o no de las macros. No recomiendo la opción Bajo por los riesgos que comporta ni Alto por lo que complica el uso de macros personales, que es nuestro objetivo.
- Sólo nos resta hacer clic en Aceptar para finalizar este proceso.
- Seleccionamos la opción Herramientas | Macros | Ejecutar macro
- En la ventana emergente Selector de macros nos posicionamos en el icono que representa nuestro documento y hacemos clic en la crucecita que precede al icono.
- Se despliega su estructura de carpetas (biblioteca o librería Standard, es como se denomina a lo que aparece a continuación) y hacemos de nuevo clic en la crucecita que precede a Standard (9).
- Se muestra el contenido de Standard, en estos momentos únicamente Module1.
- Haciendo clic en Module1 se muestra en Nombre de macro (ventana a la derecha de Biblioteca) el listado de las macros que hayamos creado.
- Haciendo clic en una de las macros esta se activará y ejecutará en el documento la secuencia de acciones que hayamos grabado.