miércoles, 26 de noviembre de 2025
Evaluación.
martes, 15 de julio de 2025
Textos. OOo Basic
Copiar y pegar texto entre documentos
Sub CopiarTexto
Dim sRuta As StringDim mOpciones(0) As New "com.sun.star.beans.PropertyValue"Dim oDoc As ObjectDim NombreDoc As String
NombreDoc = "AutoDocTxt"'Acceder al documento. Sustituir la ruta por la propia.sRuta = ConvertToUrl(Ruta_absoluta_del_documento & NombreDoc & ".odt")oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )'Copiar el contenido o texto del documento (en este ejemplo, AutoDocTxt.odt)dim document as objectdim dispatcher as objectdocument = ODoc.CurrentController.Framedispatcher = createUnoService("com.sun.star.frame.DispatchHelper")dispatcher.executeDispatch(document, ".uno:GoToStartOfDoc", "", 0, Array())dispatcher.executeDispatch(document, ".uno:EndOfDocumentSel", "", 0, Array())dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())'Pegar el texto en Calcdim documentCalc as objectdocumentCalc = ThisComponent.CurrentController.Framedim args1(0) as new com.sun.star.beans.PropertyValueargs1(0).Name = "ToPoint"args1(0).Value = "$A$1"dispatcher.executeDispatch(documentCalc, ".uno:GoToCell", "", 0, args1())dispatcher.executeDispatch(documentCalc, ".uno:Paste", "", 0, Array())'Cerrar el documento Writer que contiene el textooDoc.close(True)
End Sub
En este caso el proceso se concreta como copia desde Calc de un texto contenido en un documento Writer. No es la única opción, siendo posibles diferentes combinaciones, pero ésta nos sirve como ejemplo para el resto, siendo suficiente con realizar algunos cambios en la identificación de los archivos de origen y destino. Esto, claro está, te queda a ti como tarea.
martes, 3 de diciembre de 2024
Textos. Automatización.
Textos desde macros
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)
Herramientas. Procedimientos.
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)













