Generador de documentos a la carta

Uno de los principales objetivos de la informática es automatizar en lo posible aquellos trabajos que resulten altamente repetitivos. De hecho, muchas empresas y profesionales precisan generar una gran cantidad de documentos copiando y pegando bloques de texto de otros documentos existentes.

Hemos pensado en como aportar algún recurso para que los usuarios puedan automatizar estos procesos, y entre muchas opciones hemos encontrado la que hoy presentamos y que consideramos en particular interesante: un documento que permita crear de forma automatizada nuevos documentos a la carta, combinando bloques de texto a petición del usuario.

No es una solución definitiva, ni de lejos lo pretende. Creemos que puede ser un punto de partida en muchos casos, y que puede abrir nuevas opciones a otros muchos usuarios.

Y sí, estamos de acuerdo: es raro en un blog de Excel mostrar una solución hecha en Word. Pero es que somos así de originales 

Mostrar la ficha Programador

Antes que nada, dado que necesitaremos incorporar algunos botones y otros elementos especiales (conocidos como controles) a nuestro documento, debemos activar la ficha Programador.

Desde la ficha Archivo > Opciones > Personalizar cinta de opciones  activamos en la lista de la derecha la ficha Programador.

Mostrar la ficha Programador en Excel 2010

A partir de este momento, dispondremos de una nueva ficha en nuestro Word que nos permitirá insertar controles, grabar macros y acceder al editor VBA de forma rápida y sencilla.

El panel de control del Generador

Llamaremos Generador al documento generador de documentos a la carta. Y vamos a crear uno paso a paso.

El proceso de creación de este documento requiere algunos conocimientos altamente técnicos, que esperamos suplir con nuestros comentarios y las imágenes que aportamos. Si seguimos todo paso a paso fielmente, el resultado debe ser el éxito. Comencemos.

En los siguientes pasos crearemos un nuevo documento en blanco, al que agregaremos los botones y controles necesarios, y los textos que formarán los bloques que se utilizarán para los nuevos documentos.

  • Crea un nuevo documento en blanco (ficha Archivo > Nuevo > Documento en blanco > Crear)
  • Para que nos resulte fácil posicionar los controles en la hoja, insertaremos una tabla de 5×5 celdas (Ficha Insertar > Tabla, desplaza el ratón sin hacer clic hasta que selecciones un rectángulo de 5×5 celdas, y haz clic )
  • Combina las celdas señaladas con una flecha roja en la imagen (selecciona dos o más celdas y activa desde la ficha Herramientas de tabla > Presentación > Combinar celdas) para que presente este aspecto:

Esqueleto del panel que albergará los botones hecho con una simple tabla

  • Selecciona todas las celdas de la tabla (sitúa el ratón sobre cualquier celda de la tabla; en la esquina superior izquierda se muestra un botón con una cruz de cuatro flechas azul; haz clic sobre ese botón) y aplica a todas las celdas alineación centro-centro (ficha Herramientas de tabla > Presentación > Grupo Alineación > Alinear verticalmente)
  • Si no lo está, activa desde la ficha Herramientas de tabla > Presentación > Ver cuadrículas
  • Con toda la tabla seleccionada, elimina los bordes desde la ficha Herramientas de tabla > Diseño > Bordes > Sin borde

Insertar los controles

Bien, ya tenemos preparada la estructura donde vamos a colocar los controles; sigamos paso a paso y con cuidado todos los puntos siguientes.

  • Haz clic en la primera celda (arriba a la izquierda)
  • Inserta un control Botón de alternar mediante el siguiente procedimiento:
    • Selecciona desde la ficha Programador > grupo Controles > Herramientas heredadas > Botón de alternar (control ActiveX)

 Insertar un botón de alternar en la primera celda de la tabla

  •  
    • Si no se muestra, activa la ventana Propiedades desde la ficha Programador > grupo Controles > Propiedades
    • Desde la ventana propiedades, establece o cambia las siguientes propiedades:
      • (Name) a Bt01 (letras Bt, números 01)
      • Caption a Texto 1
      • Height a 25 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)
      • Width a 70 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)

La ficha Propiedades nos permite modificar todas las propiedades del control

  • Selecciona y copia el botón de alternar insertado
  • Haz clic en la segunda celda de la primera fila
  • Pega; en la ventana propiedades, cambia su propiedad (Name) a Bt02, y su propiedad Caption a Texto 2
  • Repite este último punto en el resto de celdas hasta un total de 16 botones (el último será el botón Bt16, Texto 16) y obtener un resultado como el mostrado en la siguiente imagen:

Ya hemos agregado los 16 botones de alternar en la tabla

  • Haz clic en la celda vacía superior derecha
  • Inserta un control Botón de comando mediante el siguiente procedimiento:
    • Selecciona desde la ficha Programador > grupo Controles > Herramientas heredadas > Botón de comando (control ActiveX)

Insertar un botón de comando en la tabla

    • Si no se muestra, activa la ventana Propiedades desde la ficha Programador > grupo Controles > Propiedades
    • Desde la ventana propiedades, establece o cambia las siguientes propiedades:
      • (Name) a BtCrear.
      • Caption a Crear documento.
      • Height a 50 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)
      • Width a 100 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)

 

  • Haz clic en la celda justo debajo.
  • Inserta un control Casilla de verificación mediante el siguiente procedimiento:
    • Selecciona desde la ficha Programador > grupo Controles > Herramientas heredadas > Casilla de verificación (control ActiveX).
    • Si no se muestra, activa la ventana Propiedades desde la ficha Programador > grupo Controles > Propiedades.
    • Desde la ventana propiedades, establece o cambia las siguientes propiedades:
      • (Name) a ChkIntros
      • Caption a Añadir Intros
      • Height a 25 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)
      • Width a 90 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)

 

  • Haz clic en la celda justo debajo
  • Inserta un control Casilla de verificación mediante el siguiente procedimiento:
    • Selecciona desde la ficha Programador > grupo Controles > Herramientas heredadas > Casilla de verificación (control ActiveX)
    • Si no se muestra, activa la ventana Propiedades desde la ficha Programador > grupo Controles > Propiedades
    • Desde la ventana propiedades, establece o cambia las siguientes propiedades:
      • (Name) a ChkRestableceTodo
      • Caption a Reestablecer todo al terminar
      • Font cambia a tamaño 8 haciendo un clic en el botón con 3 puntos mostrado al hacer clic sobre la propiedad
      • Modificar la propiedad Font - tamaño del texto - del control
      • Height a 25 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)
      • Width a 90 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)

 

  • Haz clic en la celda larga de la última fila
  • Teclea el texto Guardar como
  • Pulsa Intro dos veces
  • Teclea el texto Dejar vacío para no guardar el documento automáticamente; el documento se guarda en la carpeta por defecto, y cambia su tamaño a 8 puntos
  • Cambia la alineación de la celda desde ficha Herramientas de tabla > Presentación > Grupo Alineación > Alinear en el centro a la izquierda
  • Haz clic en la línea en blanco entre las dos líneas de texto recien insertadas
  • Inserta un control Cuadro de texto mediante el siguiente procedimiento:
    • Selecciona desde la ficha Programador > grupo Controles > Herramientas heredadas > Cuadro de texto (control ActiveX)
    • Si no se muestra, activa la ventana Propiedades desde la ficha Programador > grupo Controles > Propiedades
    • Desde la ventana propiedades, establece o cambia las siguientes propiedades:
      • (Name) a NomDoc
      • Height a 25 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)
      • Width a 425 (seguramente tras pulsar Intro o cambiar a otra propiedad mostrará un valor ligeramente distinto)

La parte de agregar los controles ya ha finalizado. Si quieres, podemos dar un par de toques para mejorar el acabado, como por ejemplo, hacer las filas un poco más altas, para que los botones se muestren un poco más separados (selecciona la tabla, y desde la ficha Herramientas de tabla > Presentación > grupo Tamaño de celda > Alto de fila de tabla puedes establecerlo, por ejemplo, a 1,1 cm.)

Guardar el documento habilitado para macros

Creemos que va siendo hora de que guardemos el documento. Nosotros lo hemos hecho con el nombre Generador de Documentos Automatizado.

Al guardarlo, en la propiedad Tipo selecciona Documento habilitado con macros de Word (*.docm).

Es muy importante, ya que si no lo hacemos así, el documento no podrá guardar ni ejecutar macros.

Los bloques de texto

Ahora vamos a agregar los bloques de textos. Cada bloque de texto podrá estar formado por uno o más párrafos, puede contener imágenes, tablas, etc.

Lo importante es delimitar cada bloque para que la macro pueda encontrarlo para copiarlo y pegarlo al nuevo documento, sin cometer errores.

Los bloques de texto los vamos a delimitar con un párrafo al principio del bloque que contendrá el delimitador Texto n, y otro párrafo al final del bloque que contendrá el delimitador Fin de texto n, en donde n va a ser un número del 1 al 16, que identifica cada bloque de texto. Con este sencillo truco, podemos fácilmente delimitar los bloques.

Mientras decides qué textos vas a agregar a tu generador, quizás quieras antes probar con texto simulado. Veamos como hacerlo:

  • Haz clic justo debajo del panel del Generador (la tabla)
  • Inserta un párrafo vacío
  • Teclea Texto 1 y pulsa Intro
  • Teclea =rand(2,3) y pulsa Intro
  • Teclea Fin Texto 1 y pulsa Intro
  • Selecciona los 4 párrafos y copia
  • Pega 15 veces; en cada una de ellas, cambia el número correspondiente en ambos párrafos delimitadores a 2, 3, 4… hasta el 16

Con unos sencillos párrafos con los delimitadores Texto 1 y Fin Texto 1 delimitamos el bloque de texto 1

Una forma sencilla para distinguir los textos que de momento son iguales es aplicarles un fondo de color o un color de texto distinto a cada bloque, como muestra la imagen. Más tarde podrás sustituirlos por los tuyos propios.

El código macro VBA

Vamos a agregar el código necesario para que este invento funcione. Si era importante ser preciso en todos los pasos que hemos dado hasta llegar aquí, en esta fase del proyecto debemos esforzarnos un poco más.

Empecemos por hacer un doble clic sobre el botón Crear documento de nuestro panel.

Al hacer doble clic en el botón, se muestra el editor VBA en el procedimiento que gestiona el evento Click del mismo

Como se aprecia en la imagen, al hacer doble clic sobre el control se muestra el editor VBA (Visual Basic para Aplicaciones) a la espera de que le indiquemos el código a asignar al evento Click (cuando hacemos clic) sobre el botón BtCrear. El código debe escribirse dentro del procedimiento BtCrear_Click().

Teclea, o preferiblemente, copia desde aquí y pega en el editor VBA, este código:

Private Sub BtCrear_Click()
Dim c As String

' Si se ha marcado el botón almaceno en c su número
If Me.Bt01.Value Then c = c & "1,"
If Me.Bt02.Value Then c = c & "2,"
If Me.Bt03.Value Then c = c & "3,"
If Me.Bt04.Value Then c = c & "4,"
If Me.Bt05.Value Then c = c & "5,"
If Me.Bt06.Value Then c = c & "6,"
If Me.Bt07.Value Then c = c & "7,"
If Me.Bt08.Value Then c = c & "8,"
If Me.Bt09.Value Then c = c & "9,"
If Me.Bt10.Value Then c = c & "10,"
If Me.Bt11.Value Then c = c & "11,"
If Me.Bt12.Value Then c = c & "12,"
If Me.Bt13.Value Then c = c & "13,"
If Me.Bt14.Value Then c = c & "14,"
If Me.Bt15.Value Then c = c & "15,"
If Me.Bt16.Value Then c = c & "16,"

' Si se ha marcado alguno
If c > "" Then
    ' Quito la última coma sobrante de c
    c = Left(c, Len(c) - 1)
    
    ' Creo el nuevo documento con los textos solicitados
    BuscarPegarTextos c, Me.ChkIntros.Value, Me.NomDoc.Text
    
    ' si se ha marcado reestablecer, reinicio todo
    If Me.ChkRestableceTodo Then
        Me.Bt01.Value = False
        Me.Bt02.Value = False
        Me.Bt03.Value = False
        Me.Bt04.Value = False
        Me.Bt05.Value = False
        Me.Bt06.Value = False
        Me.Bt07.Value = False
        Me.Bt08.Value = False
        Me.Bt09.Value = False
        Me.Bt10.Value = False
        Me.Bt11.Value = False
        Me.Bt12.Value = False
        Me.Bt13.Value = False
        Me.Bt14.Value = False
        Me.Bt15.Value = False
        Me.Bt16.Value = False
        Me.NomDoc.Text = ""
        Me.ChkIntros.Value = False
    End If
End If
End Sub

Debe quedar similar, no, sino exactamente igual al de la imagen:

El código del evento BtCrear_Click

El código está comentado para que podamos estudiarlo.

Tras examinar los botones, crea una variable de texto que contiene los número de aquellos que hemos pulsado. A continuación llama al procedimiento BuscarPegarTextos al que le pasa tres variables:

  1. una cadena de texto con los números de los bloques que queremos pegar en el nuevo documento, separados por comas
  2. un booleano que indica si queremos o no añadir un Intro tras de cada bloque pegado
  3. una cadena con el nombre del documento, que puede estar o no vacía

Para implementar ese procedimiento necesitamos agregar un módulo Basic a nuestro proyecto.

En el editor de VBA selecciona desde el menú Insertar > Módulo.

Se muestra en el editor el nuevo módulo creado, en donde agregaremos el procedimiento BuscarPegarTextos.

Sub BuscarPegarTextos(cTextos As String, lConIntros As Boolean, cNomDoc As String)
Dim aTextos() As String, DocGenerador As Document, DocNuevo As Document

Set DocGenerador = ActiveDocument

' creo un documento en blanco
Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
Set DocNuevo = ActiveDocument

' convierto la cadena cTextos en una matriz/array
aTextos = Split(cTextos, ",")

' Por cada elemento de la matriz
For n = 0 To UBound(aTextos)

    ' activo el generador de documentos
    DocGenerador.Activate
    DocGenerador.ActiveWindow.SetFocus
    ' Salto al inicio
    Selection.HomeKey Unit:=wdStory

    ' busco el bloque de texto
    ' delimitado por Texto n y Fin Texto n correspondiente
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "Texto " & aTextos(n) & "^13(*)^13Fin Texto " & aTextos(n) & "^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
    
    ' lo copio
    Selection.Copy
    
    ' activo el documento nuevo
    DocNuevo.Activate
    DocNuevo.ActiveWindow.SetFocus
    
    ' Pego el texto
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    
    ' Elimino los delimitadores del bloque en el texto pegado
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "Texto " & aTextos(n) & "^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
    Selection.Delete Unit:=wdCharacter, Count:=1
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "Fin Texto " & aTextos(n) & "^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
    Selection.Delete Unit:=wdCharacter, Count:=1
    
    ' si debo añadir un Intro, lo agrego ahora
    If lConIntros Then Selection.TypeParagraph
    
Next

' activo el generador de documentos
DocGenerador.Activate
DocGenerador.ActiveWindow.SetFocus
' Salto al inicio
Selection.HomeKey Unit:=wdStory
' Reinicio la ventana de búsquedas
Selection.Find.ClearFormatting

' activo el nuevo documento
DocNuevo.Activate
DocNuevo.ActiveWindow.SetFocus
' Salto al inicio
Selection.HomeKey Unit:=wdStory

' si se escribió un nombre lo guardo
If cNomDoc > "" Then
    ' Guardo el nuevo documento creado
     ActiveDocument.SaveAs2 FileName:=cNomDoc, FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
        :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
        :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
        SaveAsAOCELetter:=False, CompatibilityMode:=14
End If

' Desmarcar la siguiente línea para cerrar el nuevo documento
' ActiveWindow.Close

MsgBox "Proceso terminado; si se especificó un nombre" & vbCrLf & _
  "el documento se ha guardado en la carpeta por defecto.", _
  vbInformation, "Generador de documentos"
End Sub

De nuevo la imagen nos muestra como debe quedar nuestro trabajo:

El procedimiento BuscarPegarTextos es el que se encarga de hacer el trabajo por nosotros

Ya hemos terminado. El código está comentado, para ayudar en su comprensión.

  • El procedimiento crea un documento nuevo
  • A continuación, crea una matriz a partir de la cadena que le hemos pasado con los números de los bloques de texto a copiar en el nuevo documento
  • Entra en el bucle en que
    • Realiza una búsqueda de los delimitadores mediante la herramienta de búsqueda del propio Word, pero activando el uso de comodines. Utilizando las expresiones regulares de Word podemos seleccionar todo el texto contenido entre la marca de inicio y la de fin con una sola busqueda.
    • El texto buscado queda seleccionado, lo que nos permite copiarlo, pasar al documento nuevo y pegarlo
    • Utilizamos el mismo sistema para eliminar los delimitadores en el texto pegado del documento nuevo.
  • Finalmente, tras repetir el proceso para cada bloque de texto seleccionado, activamos cada uno de los documentos y forzamos situarnos al inicio del mismo.
  • Si se especificó un nombre, el nuevo documento se guardará en la carpeta por defecto de Word, o en la última utilizada de forma automática.
  • Si deseas que el documento se cierre automáticamente, puedes eliminar el comentario de la línea indicada (quitar la comilla simple)
  • Para terminar, mostramos un diálogo de aviso para que el usuario se dé por enterado de que el trabajo se ha realizado.

Y nuestro trabajoi con las macros ha terminado. ya podemos cerrar el editor VBA.

De nuevo, creemos que es conveniente volver a guardar el documento para que se almacenen todos los cambios realizados

Último paso

Tan sólo nos queda comprobar que todo funciona correctamente.

Para probar el Generador es preferible cerrar y volver a abrir el documento. En alguna ocasión, si no lo hemos hecho así, las macros no han funcionado adecuadamente, por lo que recomendamos este sistema para evitar problemas y hacerlo más fácil.

Al abrir el documento, y dependiendo de nuestra configuración de seguridad de macros, es posible que se presente un mensaje como el siguiente:

 Debemos habilitar el contenido activo (las macros) para poder utilizar el Generador de documentos

Para que la macro pueda ejecutarse, tenemos que hacer clic sobre Habilitar contenido. Esta opción se almacenará para este documento, y no debería preguntarse de nuevo, salvo que cambiemos de carpeta el documento, o cambiemos su nombre.

Ya puedes marcar algunas de las opciones (por ejemplo, haz clic sobre los botones de opción Texto 3, Texto 7 y Texto 12), y haz clic sobre el botón Crear documento.

Si todo ha ido bien, debemos obtener un nuevo documento con los textos correspondientes.

El nuevo documento se ha creado, y un diálogo nos advierte de ello

Puedes descargar el documento que hemos creado para este tutorial haciendo clic aquí:

Generador-de-documentos-automatizado.zip.

También puedes descargar este otro modelo en el que hemos incluído distintos tipos de textos para que realices más pruebas:

Generador-de-documentos-automatizado-modelo.zip.

Si te ha gustado, deja tu comentario y/o compártelo en las redes sociales.

11 comentarios en “Generador de documentos a la carta

  1. Esta muy padre el código, una pregunta:
    ¿Como podría implementarlo para jalar 3 imágenes de excel a cuadros de texto en word?
    Ejemplo: tengo 1 archivo de word con varios cuadros de texto y quiero meter 3 imágenes que se encuentran cada una en una celda de una tabla de excel. Espero puedas ayudarme. Gracias y felicidades!

  2. Muy bueno, muchas gracias!
    Tendrás un ejemplo para capturar datos y genere un documento WORD, es decir que el documento solo le cambien los datos capturados

  3. Si lo que quiero es que recorra el documento word y busque donde dice algún texto en específico y que ahí vaya generando distintos documentos sacando el nombre para el nuevo archivo de dicho texto y el nuevo documento contenga el texto más N imágenes bajo el texto hasta el caso siguiente, el texto siempre es el mismo al inicio pero va cambiando el número ( ejemplo: caso 1, caso 3, caso n)

    1. Supongo que modificando la macro podrás conseguirlo, siempre y cuando indiques claramente los límites de los textos a insertar.

  4. Excelente aporte por parte del autor. Me sirvió para aclarar muchas dudas acerca de crear procesos masivos y correctos. Muchas gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *