Seleccionar opciones, pulsar un botón y crear un nuevo documento a la medida

 

Queremos abrir un documento Writer donde tenemos varias casillas de opciones (checkbox), las cuales podemos marcar o no. Tras pulsar un botón, se creará un nuevo documento en el que se agregarán determinados párrafos según qué opciones hayamos marcado. De esta forma podremos construir documentos a la medida con sólo seleccionar unas opciones y pulsar un botón. El sueño de muchos.

Más o menos es lo que tatyana y una compañera están intentando hacer, y así lo han indicado en el Foro Oficial. Pero tras pelearse largas horas no parece que lo estén consiguiendo. Así que nos hemos puesto a trabajar, porque nos parece un tema muy interesante, y que puede interesar a muchos usuarios, profesionales incluídos.

Vamos a crear un documento que puede componer tantos documentos queramos combinando hasta 21 párrafos distintos.

El modelo que presentamos está limitado; sólo puede copiar un párrafo por cada casilla seleccionada; pero por supuesto que puede mejorarse, como por ejemplo, poder definir en qué orden se copian, que puedan copiarse de un párrafos, que si seleccionamos la opción X se seleccionen también la Y y la Z...

Como siempre, sólo pretendemos abrir el camino, y esperamos que cualquier mejora que querráis aportar nos la hagáis llegar, bien por nuestro correo, bien a través del foro.

Es muy importante que aquellos apartados que marcamos con fondo fosforescente se ejecuten sin cambio alguno. Sin más, comentamos el procedimiento que podeis seguir para conseguirlo

Preparar el documento origen de los textos

  • Crea un nuevo documento de Writer. Puedes utilizar uno existente, adaptándolo a lo que explicamos a continuación.
  • Guarda el documento con el nombre que prefieras (en nuestro ejemplo será Mi documento de Writer)
  • Inserta un título al documento
  • Insertar una tabla de 6 filas por 4 columnas
  • Desde el menú Ver > Barras de herramientas mostramos la llamada Campos de control de formularios. Desde ella:
    • Activamos el Modo Diseño de formulario (por defecto suele estar activado)
    • Seleccionamos Casilla de verificación y dibujamos una en la primera celda
    • Pulsamos el botón Control con la casilla seleccionada
    • Cambiamos Nombre a CV1
    • Cambiamos Título a Copiar Texto 1 (o lo que corresponda)
  • Con la casilla seleccionada, copia la casilla (menú Editar > Copiar)
  • Dejando libres las tres celdas de arriba a la derecha:
    • Haciendo clic en cada celda, pega una nueva casilla (por ejemplo, con la combinación Ctrl+V)
    • Tras pegarla, cambia su Nombre a CV2, CV3, ...
    • Cambia Título a lo que corresponda
    • En total hemos introducido 21 casillas.
  • Guarda el documento
  • Selecciona las tres celdas de arriba a la derecha: Combínadas (menú Tabla > Unir celdas)
  • De nuevo desde la barra de herramientas de Campos de control de formularios:
    • Selecciona Botón
    • Dibuja un botón
    • Cambia su Nombre a BtEjecutar y su Título a Ejecutar
    • Seleccionamos Casilla de verificación y dibujamos una debajo del botón
    • Cambia su Nombre a Intros y su Título a Añadir Intros
    • Cambia su propiedad Texto de ayuda a Añade un intro extra tras de cada bloque copiado al nuevo documento
  • Guarda el documento
  • Debajo de la tabla:
    • Añade los párrafos a copiar. Se copiarán tal cual, incluyendo su formateo (alineación, espaciado antes y después, tipo y tamaño de letra, color de letra y de fondo, color de línea, etc.)
    • Titula cada uno de ellos como Texto 1, Texto 2, etc.
    • Si lo prefieres, deja un párrafo en blanco de separación entre ellos.
    Guarda el documento

Y ya hemos terminado de preparar nuestro documento.

La macro que hará todo el trabajo

La macro que realizará el proceso es la siguiente:

Option Explicit

Sub BtEjecutar_Clic( oEv )
'-------------------------------------------------------------------------------------------
Dim n As Integer, lIntros As Boolean
Dim Form As Object, Ctrl As Object
Dim mArg(), NuevoDoc As Object
Dim DocOrg As Object, DocDst As Object
Dim Terminar As Boolean

Form = ThisComponent.Drawpage.Forms.GetByIndex(0)

' Compruebo que al menos hay una opción activada
Terminar = True
For n=1 To 21
Ctrl = Form.GetByName("CV" & n)
If Ctrl.State = 1 Then
Terminar = False
EndIf
Next

If Terminar Then
Beep
MsgBox ("No se ha seleccionado ningún bloque", 192, "open-office.es")
Else
DocOrg = ThisComponent.CurrentController.Frame
DocDst = StarDesktop.LoadComponentFromURL( "private:factory/swriter", "_default", 0, mArg() )
DocDst = DocDst.CurrentController.Frame

lIntros = Form.Intros.State = 1

For n=1 To 21
Ctrl = Form.GetByName("CV" & n)
If Ctrl.State = 1 Then
CopiarTexto( DocOrg, "Texto " & n )
PegarTexto( DocDst, lIntros )
Ctrl.State = 0
EndIf
Next

DocDst.ContainerWindow.toFront()
DocDst.ContainerWindow.SetFocus()
Beep
MsgBox ("Proceso terminado", 192, "open-office.es")
EndIf

End Sub


Sub CopiarTexto( Doc As Object, cBloque As String )
'-------------------------------------------------------------------------------------------
Doc.ContainerWindow.toFront()
Doc.ContainerWindow.setFocus()
Dim dispatcher As Object
dispatcher = CreateUNOService("com.sun.star.frame.DispatchHelper")

Dim args1(18) As New com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = True
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = False
args1(4).Name = "SearchItem.Backward"
args1(4).Value = False
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = False
args1(6).Name = "SearchItem.Content"
args1(6).Value = False
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = False
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65552
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = cBloque
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = ""
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = 0
args1(18).Name = "Quiet"
args1(18).Value = True

dispatcher.ExecuteDispatch(Doc, ".uno:ExecuteSearch", "", 0, args1())

Dim args2(1) As New com.sun.star.beans.PropertyValue
args2(0).Name = "Count"
args2(0).Value = 1
args2(1).Name = "Select"
args2(1).Value = False

dispatcher.ExecuteDispatch(Doc, ".uno:GoRight", "", 0, args2())
dispatcher.ExecuteDispatch(Doc, ".uno:EndOfParaSel", "", 0, Array())
dispatcher.ExecuteDispatch(Doc, ".uno:Copy", "", 0, Array())
dispatcher.ExecuteDispatch(Doc, ".uno:GoToStartOfDoc", "", 0, Array())

End Sub


Sub PegarTexto( Doc As Object, lExtraIntros As Boolean )
'-------------------------------------------------------------------------------------------
Dim dispatcher As Object
dispatcher = CreateUNOService("com.sun.star.frame.DispatchHelper")
dispatcher.ExecuteDispatch(Doc, ".uno:GoToEndOfDoc", "", 0, Array())
dispatcher.ExecuteDispatch(Doc, ".uno:Paste", "", 0, Array())
dispatcher.ExecuteDispatch(Doc, ".uno:InsertPara", "", 0, Array())
If lExtraIntros Then dispatcher.ExecuteDispatch(Doc, ".uno:InsertPara", "", 0, Array())
dispatcher.ExecuteDispatch(Doc, ".uno:GoToStartOfDoc", "", 0, Array())
End Sub

Dado que el trabajo se realizará desde este mismo documento, y para que podamos tener distintos documentos maestros con sólo crear una copia de este, almacenaremos la macro en el mismo documento. Los pasos a seguir son los siguientes:

  • Selecciona con cuidado el texto de la macro y desde tu navegador dile copiar (puedes pulsar Ctrl+C)

Ahora en tu documento de Writer sigue estos pasos:

  • Selecciona desde el menú Herramientas > Macros > Organizar macros > OpenOffice/LibreOffice Basic...
  • Haz clic sobre el nombre de tu documento (en nuestro caso Mi documento Writer.odt) en Desde la macro, y haz clic en el botón Nuevo
Insertar macro en documento Writer


 

  • En Nombre escribe OpenOfficeES (o el que tú prefieras, o deja el nombre por defecto) y haz clic en Aceptar

Insertar macro en documento Writer


 

  • Se abrirá el editor Basic; desde su menú Editar > Seleccionar todo, y de nuevo desde el menú Editar > Pegar

Ya tienes la macro pegada en el documento.

  • Cierra el editor Basic. Los cambios realizados serán almacenados.

Asignar la macro al botón

Para que la macro se ejecute cuando pulsemos el botón, nos queda un último paso:

  • Selecciona el botón
  • Desde la ventana Popiedades:Botón, pestaña Acontecimientos, clic sobre el botón con 3 puntos al nivel de Botón del ratón soltado,clic en el botón Macro...

 

 

  • Selecciona en Biblioteca el + delante del nombre del documento, el + delante de Standard, clic sobre OpenOfficeES
  • En Nombre de macro, selecciona BtEjecutar_Clic; clic en Aceptar
  • Clic en Aceptar
  • Clic en el botón Modo diseño de la barra de herramientas Campos de control de formulario
  • Cierra la barra de herramientas Campos de control de formulario
  • Guarda tu documento
  • Y para terminar...

    Nada. ¡¡¡ Ya has terminado !!!

    ¡Ya puedes probar tu nuevo documento constructor de documentos!

    Si te ha gustado, puedes votar (abajo a la derecha) y/o apoyarnos visitando alguna página de nuestros patrocinadores.

    También puedes descargar el documento que nosotros hemos creado:

    Descargar documento Copia Selectiva de textos a nuevo documento.odt

     

    Cómo actúa la macro

    Tras seleccionar las opciones correspondientes y pulsar el botón, se desencadena la macro llamada BtEjecutar_Clic.

    Los controles pasan siempre a la subrutina o función asociada un objeto que solemos denominar Evento, y representamos por oEv.

    Desde este objeto se puede acceder a los controles que hemos situado en el documento Writer, conformando en realidad un formulario, pero nos resulta mucho más cómodo acceder a ellos a través de los objetos formulario donde en realidad se almacenan, que es en la llamada Drawpage del documento. Como sólo tenemos un formulario, seguro que es el que tiene como índice 0, pero si no fuera así, deberíamos localizarlo antes.

    Acto seguido comprobamos accediendo a los controles checkbox si alguno está marcado, a través de su propiedad State; al nombrarlos secuencialmente desde el 1 al 21, nos resulta muy fácil recorrerlos con un simple bucle For.

    Si no existen opciones marcadas, emitimos un pitido y presentamos un mensaje; en caso contrario, empieza la acción.

    • Almacenamos en una variable objeto el documento actual, al que llamamos DocOrg, por documento origen.
    • Creamos un nuevo documento, el destino, al que llamamos DocDst.
    • Como necesitamos acceder a la capa del texto, cargamos en DocDst esa capa.
    • Iniciamos un bucle para recorrer cada uno de los checkbox de nuevo. Si está marcado:
      • Llamo a la sub CopiarTexto, que se encarga en el documento origen de:
        • buscar el texto pasado (Texto 1, Texto 14...) [#]
        • bajar una línea [#]
        • ir al principio del párrafo [#]
        • seleccionar y copiar el párrafo completo [#]
        • volver al principio del documento [#]
      • Llamo a la sub PegarTexto, que se encarga en el documento destino de:
        • ir al final del documento [#]
        • pegar el párrafo [#]
        • insertar un Intro [#]
        • si se marcó la opción, insertar un Intro extra
        • volver al principio del documento [#]
      • Desmarco el checkbox
    • Tras finalizar el bucle, hacemos que el documento destino pase a primer plano forzando que tome el foco, emitimos un pitido y presentamos un mensaje.

    Los procesos marcados con un  [#] se ha grabado con la grabadora de macros, y el código se ha adaptado con un poquito (o un muchito) de imaginación. El resto, experiencia, buscar aquí y allá en la web, el libro de Mauricio, el de Pitonyak...

    5 comentarios

    Comentario De: bantonio [Visitante]

    Un trabajo muy bueno.
    Puede ser útil para que los profesores hagan exámenes con un documento que tenga una base de preguntas

    31.01.16 @ 02:08 Reply to this comment
    Comentario De: Pedris [Visitante]  

    Estupenda plantilla. Me encanta.
    La estoy adaptando a mi trabajo para generar informes con cabeceros o cuerpo de contenido diferentes. Enhorabuena.

    22.02.16 @ 18:47 Reply to this comment
    Comentario De: matias [Visitante]

    Muy buena idea, Felicitaciones.
    Para mi trabajo ando buscando algo similar pero que copie los contenidos, específicamente tablas, a partir de archivos en html pero que se abren con el editor web de writter. Se podría adaptar esta idea a algo así? debo señalar que de macros no tengo conocimiento. Saludos

    28.03.19 @ 20:33 Reply to this comment
    Comentario De: [Miembro]

    Hola Matías
    Recomiendo que recurra al Foro Oficial de OpenOffice; es posible que los voluntarios le ayuden en este tema.
    Realizar lo que solicita, sin macros, es posible, pero no automatizable.
    Con macros puede ser automatizable, si bien con reservas. Es necesario estudiar el caso con ejemplos prácticos.
    En el foro puede encontrar esa ayuda.
    Saludos :-)

    02.04.19 @ 00:38 Reply to this comment
    Comentario De: matias [Visitante]

    Muchas gracias, voy a ver la opción de postear en el foro para pedir ayuda

    Saludos

    03.04.19 @ 02:52 Reply to this comment


    Form is loading...