En este quinto bloque veremos:

  • 5.1 Recapitulando: Inventario final de objetos y marcadores antes de la unión definitiva.
  • 5.2 Creando el botón guardar y programando su contenido: La orden maestra para que los datos fluyan hacia la plantilla.
  • 5.3 Uniendo varios objetos en un mismo marcador: Posibilidad de crear textos combinando varios objetos.
  • 5.4 Probando el programa: Diferencias entre el uso diario y la edición técnica, y cómo lograr un documento limpio mediante el borrado de marcadores.
  • 5.5 Revisión final: Abordando la posibilidad de modificar, corregir o revisar los resultados.

5.1 Recapitulando

 

Antes de lanzarnos a escribir la gran orden final, pongamos en orden los elementos que hemos construido hasta ahora. Este es nuestro inventario:

  • En el formulario (objetos):
    • cmbDecision: El desplegable con dos opciones únicas: “Prorrogar” y “Denegar”.
    • tglComunicación: El botón de medida para la prohibición de comunicación.
    • tglAproximación: El botón de medida para la prohibición de aproximación.
  • En la plantilla (marcadores):
    • fecha: El punto de aterrizaje para la fecha del día.
    • decisión: El hueco donde el Word explicará la acción (“la prórroga” o “denegar la prórroga”).
    • partedispositiva: El espacio bajo el cual se redactará la decisión final.

 

Hasta ahora, todo lo que ocurría en el formulario se quedaba en el formulario, y todo lo que escribíamos en la plantilla tenía carácter estático, pero no dinámico. Para que esa información viaje al papel, necesitamos una orden que diga: “Cuando pulse este botón, coge lo que hay aquí y escríbelo allá”.

 

5.2 Creando el botón guardar y programando su contenido

 

Por ello, vuelve a tu formulario (el corcho de tu UserForm) y, usando el cuadro de herramientas, dibuja un CommandButton. Siguiendo nuestra nomenclatura, lo llamaremos cmdGuardar y en su propiedad Caption escribiremos “Guardar”.

 


 

Este botón será el ejecutor de la magia, pues vamos a hacer que al clicar sobre él se rellene nuestro formulario. Para ello, y recuperando las nociones del Bloque III, hacemos clic sobre el botón y veremos que se crea el bloque: Private Sub cmdGuardar_Click().

 

Es precisamente dentro de esta subrutina donde vamos a escribir el código que logrará que los datos fluyan al formulario.

 

La estructura técnica para trabajar sobre los marcadores es la siguiente:

 

ActiveDocument.Bookmarks(“marcador”).Range.Text = objeto.Value

 

Si desglosamos esta línea, vemos que se compone de tres partes diferenciadas:

  • El destino (izquierda): ActiveDocument.Bookmarks(“...”).Range.Text. Le indica al programa que debe buscar en el Documento Activo, localizar un marcador concreto por su nombre y acceder a su propiedad de Texto.
  • El operador de asignación (=): Su función es coger el valor que hay a su derecha y volcarlo en la ubicación que tiene a su izquierda.
  • El origen (derecha): cboDecision.Value Es la fuente de la información. Aquí especificamos de qué objeto del formulario queremos extraer el dato (el ComboBox) y qué propiedad nos interesa (su valor seleccionado).

En nuestro caso, lo que queremos conseguir es que, al pulsar el botón Guardar, el ordenador realice las siguientes comprobaciones automáticas:

  • Autogestión de la fecha: El programa debe consultar el calendario del sistema y escribirla con formato formal (ej. 1 de enero de 2026) en el marcador fecha.
  • Redacción inteligente del fundamento: Si en el desplegable elegimos “Prorrogar”, el marcador decisión debe decir “la prórroga”. Si elegimos “Denegar”, debe escribir “denegar la prórroga”.
  • Redacción inteligente de la parte dispositiva: Queremos que el contenido de partedispositiva cambie según nuestra elección:
    • Si denegamos: El programa debe escribir directamente el texto de cese inmediato de las medidas.
    • Si prorrogamos: El programa debe “mirar” qué botones de medida hemos dejado pulsados y redactar la frase exacta:
      • Si solo pulsamos comunicación, redacta solo esa medida.
      • Si solo pulsamos aproximación, redacta solo esa medida.
      • Si pulsamos ambas, construye la frase plural combinando las dos.

 

Para lograr lo anterior, usaremos este código que explicaremos a continuación:

 

Private Sub cmdGuardar_Click() 'Instrucciones para el primer marcador "fecha" ActiveDocument.Bookmarks("fecha").Range.Text = Format(Date, "d \d\e mmmm \d\e yyyy") 'Instrucciones para el segundo marcador "decisión" If cmbDecision.Value = "Prorrogar" Then ActiveDocument.Bookmarks("decisión").Range.Text = "la prórroga" If tglComunicación.Value = True And tglAproximación.Value = False Then ActiveDocument.Bookmarks("partedispositiva").Range.Text = "La prórroga de la medida de prohibición de comunicación." ElseIf tglAproximación.Value = True And tglComunicación.Value = False Then ActiveDocument.Bookmarks("partedispositiva").Range.Text = "La prórroga de la medida de prohibición de aproximación." ElseIf tglAproximación.Value = True And tglComunicación.Value = True Then ActiveDocument.Bookmarks("partedispositiva").Range.Text = "La prórroga de las medidas de prohibición de aproximación y comunicación acordadas" End If 'Instrucciones para el tercer marcador "partedispositiva" ElseIf cmbDecision.Value = "Denegar" Then ActiveDocument.Bookmarks("decisión").Range.Text = "denegar la prórroga" ActiveDocument.Bookmarks("partedispositiva").Range.Text = "Denegar la prórroga de las medidas acordadas, decretándose su cese de forma inmediata." End If 'Borramos el botón de acceso ActiveDocument.InlineShapes(1).Delete 'Cerramos el formulario Unload Me End Sub

 

Partimos de que el código no se imprime todo a la vez, sino que fluye de arriba abajo. Este es el orden exacto de las operaciones cuando pulsas el botón:

  1. Carga de fecha: La primera línea consulta el reloj del sistema y escribe la fecha actual en el marcador fecha.
  2. Primer if: El ordenador mira el valor de cmbDecision.
    • Si el valor es exactamente “Prorrogar”, se cumple la condición y se mete dentro de este bloque.
    • Segundo if: El código comprueba el valor de los botones tglComunicación y tglAproximación, y atribuye a ActiveDocument.Bookmarks(“partedispositiva”).Range.Text un texto según cada posibilidad.
      • Si el valor es “Denegar”, salta directamente al final, al bloque ElseIf (que también funcionaría si pusiéramos solo Else).
  3. Cierre: Una vez que ha escrito en los marcadores, llegan dos órdenes:
    • ActiveDocument.InLineShapes(1).Delete, que elimina el botón de iniciar formulario en nuestro archivo Word. En realidad esto elimina solo el primer objeto, pero nos servirá ya que la otra opción es más compleja.
    • Unload Me, que cierra el formulario de la pantalla y de la memoria.

Verás que en el código he usado comentarios para ilustrar qué hace cada cosa. En VBA, los comentarios se crean usando ‘ y aparecen siempre en verde, siendo muy útiles para ir explicando qué hace cada parte del código y así no volvernos locos.


5.3 Uniendo varios objetos en un mismo marcador


Hasta ahora, nos hemos limitado a realizar una asignación directa y sencilla: cogíamos el valor de un único objeto y lo inyectábamos tal cual en un marcador de Word. Por ejemplo, si el usuario elegía "Prorrogar", el marcador simplemente recibía esa palabra.

ActiveDocument.Bookmarks("decisión").Range.Text = "la prórroga"

Sin embargo, en la práctica diaria, a menudo querremos que un mismo marcador refleje una combinación del resultado de varios objetos del formulario. Es decir, que el programa sea capaz de redactar una frase compleja uniendo diferentes datos que hemos ido introduciendo.

Para entender cómo se hace, apartémonos ligeramente un momento del formulario que veníamos trabajando. Imaginemos que para la medida de alejamiento hubiéramos creado dos cuadros de texto adicionales: uno llamado txtDistancia (donde escribimos los metros) y otro txtSujetoPasivo (donde escribimos el nombre de la presunta víctima). Lo que querremos es que en la parte dispositiva de nuestro auto se una todo automáticamente para decir:

"...de aproximarse a menos de 500 metros y de comunicarse con D. Manuel Martínez.”

Para lograr eso, utilizaremos una técnica llamada concatenación, que consiste en coser fragmentos de texto fijo con los valores variables de nuestros objetos usando el símbolo &.

La instrucción técnica para construir esa frase sería la siguiente:

ActiveDocument.Bookmarks("partedispositiva").Range.Text = "de aproximarse a menos de " & txtDistancia.Value & " metros y de comunicarse con " & txtSujetoPasivo.Value & “.”

  • El texto fijo va entre comillas: Todo lo que quieres que aparezca siempre igual (como "de aproximarse a menos de ") debe ir encerrado en comillas dobles (" ").
  • El símbolo & es el pegamento: Debes colocar un & cada vez que pases de un texto fijo a un objeto, y otro & cuando vuelvas del objeto al texto fijo.
  • Cuidado con los espacios: El ordenador es muy literal. Si no dejas un espacio físico antes de cerrar la comilla (ej. " de " &), el dato aparecerá pegado a la palabra anterior (ej. "de500").

Esta capacidad de combinar variables es lo que transforma un simple formulario en un redactor jurídico inteligente, permitiéndote generar cláusulas completas y personalizadas con un solo clic.


5.4 Probando el programa


Para entender cómo probar nuestra herramienta sin sobresaltos, debemos partir de la base de que estamos trabajando con un archivo .dotm. Esto significa, sencillamente, que nuestro documento es una plantilla contenedora de macros, es decir, un archivo especial que guarda en su interior tanto el diseño del texto como toda la inteligencia del código que hemos programado.

El hecho de que sea una plantilla marca una diferencia fundamental en el comportamiento del archivo. Por definición, una plantilla actúa como un molde maestro de referencia. Esto implica que, una vez que hayamos creado nuestro contenido y hayamos cerrado el documento, la próxima vez que intentes acceder al archivo haciendo doble clic sobre él, lo que se abrirá no será tu plantilla original, sino una copia nueva llamada "Documento 1".

Esta distinción es la clave para realizar pruebas seguras:

  • El uso diario (Doble clic): Al actuar como molde, puedes entrar en ese "Documento 1", ejecutar el formulario, dejar que el código escriba los textos y borre los marcadores. Podrás editar y guardar esta copia cuantas veces quieras sin afectar lo más mínimo a tu plantilla original. Es, por tanto, el entorno perfecto para verificar que todo funciona correctamente antes de dar el trabajo por terminado.
  • La edición técnica (Botón derecho > Abrir): Por el contrario, si haces clic derecho sobre el archivo y seleccionas "Abrir", estarás entrando directamente en el "corazón" de la plantilla. Aquí no estás trabajando sobre una copia, sino sobre el molde original.

En nuestro caso, si lo único que quieres comprobar es si los objetos del formulario se comportan como deben (por ejemplo, ver si al pulsar un botón se activa otro, o si el desplegable muestra las opciones correctas), no hay ningún peligro. Mientras el código solo afecte a la propia ventana del formulario y no toque el documento de Word, puedes hacer todas las pruebas que quieras desde cualquier sitio.

El problema real surge cuando probamos las funciones que inyectan datos o borran elementos en el documento. Para realizar comprobaciones relacionadas con los marcadores, mi recomendación es que no ejecutes las pruebas abriendo directamente la plantilla base, sino que uses una copia nueva basada en él (un “Documento 1”) haciendo doble clic como decíamos en la introducción.

No obstante, si en algún momento realizaras los cambios en la propia plantilla, no pasaría nada, pero ten en cuenta que cada vez que uses el botón “Guardar” del formulario, tendrás que volver al documento plantilla y hacer clic al botón de atrás hasta volver a tener el formulario limpio con los marcadores configurados.

 

Considerado lo anterior, si ejecutáramos el código tal cual lo tenemos ahora, veríamos que la información se proyecta en el Word: aparece la fecha de hoy, se sustituye el marcador decisión y partedispositiva en base a nuestras elecciones, pero los corchetes grises ][ siguen rodeando el texto. Esto ocurre porque, aunque hayamos inyectado el dato, el marcador (la etiqueta) sigue existiendo en el documento.

 


Para que el resultado sea un documento limpio y profesional, hemos añadido la instrucción .Delete al final.

 

Private Sub cmdGuardar_Click()

'Instrucciones para el primer marcador "fecha"

ActiveDocument.Bookmarks("fecha").Range.Text = Format(Date, "d \d\e mmmm \d\e yyyy")

 

'Instrucciones para el segundo marcador "decisión"

If cmbDecision.Value = "Prorrogar" Then

     ActiveDocument.Bookmarks("decisión").Range.Text = "la prórroga"

 

     If tglComunicación.Value = True And tglAproximación.Value = False Then

         ActiveDocument.Bookmarks("partedispositiva").Range.Text = "La prórroga de la medida de prohibición de comunicación."

     ElseIf tglAproximación.Value = True And tglComunicación.Value = False Then

         ActiveDocument.Bookmarks("partedispositiva").Range.Text = "La prórroga de la medida de prohibición de aproximación."

     ElseIf tglAproximación.Value = True And tglComunicación.Value = True Then

         ActiveDocument.Bookmarks("partedispositiva").Range.Text = "La prórroga de las medidas de prohibición de aproximación y comunicación acordadas"

     End If

 

    'Instrucciones para el tercer marcador "partedispositiva"

ElseIf cmbDecision.Value = "Denegar" Then

     ActiveDocument.Bookmarks("decisión").Range.Text = "denegar la prórroga"

     ActiveDocument.Bookmarks("partedispositiva").Range.Text = "Denegar la prórroga de las medidas acordadas, decretándose su cese de forma inmediata."

End If

 

'Borramos el botón de acceso

ActiveDocument.InlineShapes(1).Delete

 

   'Eliminamos los marcadores

ActiveDocument.Bookmarks("fecha").Delete

ActiveDocument.Bookmarks("decisión").Delete

ActiveDocument.Bookmarks("partedispositiva").Delete

 

'Cerramos el formulario

Unload Me

End Sub

   

 

Con este añadido, si ejecutamos el formulario de nuevo veremos como ahora sí, el programa no solo introduce la información en cada marcador, sino que, tras ello, elimina el símbolo][, dejando el texto limpio y listo para su revisión final.

 

5.5 Revisión final

Una vez que has pulsado el botón de "Guardar" y la información se ha volcado en el documento, es importante recordar que el resultado obtenido es plenamente editable. El objetivo de nuestra herramienta es automatizar la estructura y los datos fijos para ahorrarte tiempo, pero el proceso no termina cuando el código deja de ejecutarse.

Debes tener presente que, por muy avanzado que sea un formulario, este no siempre podrá capturar todas las particularidades o vicisitudes de cada caso judicial. En aquellos supuestos en los que necesites pulir, detallar, concretar o corregir cualquier matiz del texto resultante, siéntete con total libertad para hacerlo. Al fin y al cabo, una vez que el formulario se cierra, lo que tienes ante ti es un documento de Word normal y corriente.

La magia de la automatización ya ha hecho el trabajo pesado por ti, pero el toque final de calidad y la precisión definitiva dependen siempre de tu supervisión manual. No veas el documento resultante como un producto final inamovible.