Cómo crear un formulario de usuario VBA de Word que persista entre sesiones de documento
🔍 WiseChecker

Cómo crear un formulario de usuario VBA de Word que persista entre sesiones de documento

Tiene un formulario de usuario VBA personalizado en Word que funciona bien dentro de un documento, pero desaparece o se restablece cada vez que cierra y vuelve a abrir el archivo. Esto ocurre porque los formularios de usuario VBA se almacenan en el módulo del documento y se destruyen cuando el documento se descarga. Este artículo explica cómo diseñar un formulario de usuario VBA que conserve su estado y configuración entre sesiones de documento almacenando datos en una ubicación persistente, como una plantilla, una clave del registro o un archivo de texto simple.

Puntos clave: Persistencia de un formulario de usuario VBA de Word entre sesiones

  • Almacenar el formulario de usuario en una plantilla global (Normal.dotm): Mantiene el formulario y su código disponibles en todos los documentos y sesiones.
  • Usar SaveSetting y GetSetting de VBA: Escribir y leer los valores de los controles del formulario de usuario en el registro de Windows para que sobrevivan al cierre del documento.
  • Cargar la configuración en UserForm_Initialize: Rellenar los controles desde el registro o un archivo cuando se abre el formulario, restaurando el último estado.

ADVERTISEMENT

Por qué los formularios de usuario VBA se restablecen al cerrar el documento

Un formulario de usuario VBA incrustado en un documento específico (.docm) forma parte del proyecto VBA de ese documento. Cuando Word cierra el documento, todo el proyecto VBA se descarga de la memoria. Todos los valores de las variables, los estados de los controles del formulario y cualquier dato no guardado se pierden. El formulario en sí sigue existiendo en el archivo del documento, pero su estado en tiempo de ejecución —como las entradas de los cuadros de texto, las selecciones de los cuadros combinados o los estados de las casillas de verificación— desaparece.

El problema principal es la diferencia entre la persistencia en tiempo de diseño (el formulario permanece en el archivo) y la persistencia en tiempo de ejecución (los valores que introdujo el usuario desaparecen). Para que el formulario persista realmente entre sesiones, debe separar el código del formulario del ciclo de vida del documento. Los dos enfoques fiables son:

  • Mover el formulario de usuario a una plantilla global para que permanezca cargado mientras Word se esté ejecutando
  • Guardar y restaurar los valores de los controles usando un mecanismo de almacenamiento externo, como el registro de Windows, un archivo de texto o una parte XML personalizada en el documento

Método 1: Almacenar el formulario de usuario en una plantilla global

Una plantilla global como Normal.dotm permanece cargada durante toda la sesión de Word. Cualquier formulario de usuario colocado en Normal.dotm está disponible desde cualquier documento. Sus controles conservan sus valores hasta que el usuario cierra Word o descarga el formulario manualmente. Este método es la forma más sencilla de mantener un formulario activo a través de múltiples aperturas y cierres de documentos dentro de la misma sesión de Word.

Requisitos previos

  • Acceso al editor de VBA (Alt+F11)
  • Permiso para modificar Normal.dotm — esto normalmente está permitido a menos que su política de TI lo restrinja
  • El código del formulario de usuario debe ser autocontenido y no hacer referencia a propiedades específicas del documento que cambien

Pasos para agregar el formulario de usuario a Normal.dotm

  1. Abrir el editor de VBA y localizar Normal.dotm
    Presione Alt+F11. En el Explorador de proyectos, busque el proyecto llamado “Normal”. Esta es su plantilla Normal.dotm. Si no ve el Explorador de proyectos, presione Ctrl+R.
  2. Insertar un nuevo formulario de usuario en Normal.dotm
    Haga clic con el botón derecho en el proyecto Normal, seleccione Insertar > UserForm. Aparece un formulario en blanco en el editor. Agregue los controles que necesite: cuadros de texto, cuadros combinados, casillas de verificación y botones de comando.
  3. Escribir el código del formulario en Normal.dotm
    Haga doble clic en el formulario o en un control para abrir el panel de código. Escriba los controladores de eventos, como UserForm_Initialize y los procedimientos de clic de botón, dentro del proyecto Normal. No use el módulo ThisDocument de ningún archivo .docm específico.
  4. Crear una macro para mostrar el formulario
    Inserte un módulo estándar en Normal.dotm. Escriba un procedimiento Sub como Sub ShowMyForm() que contenga UserForm1.Show. Asigne esta macro a un botón de la cinta de opciones o a un atajo de teclado para un acceso fácil.
  5. Guardar Normal.dotm
    Word le pedirá que guarde los cambios en Normal.dotm al salir. Acepte el mensaje. El formulario ahora forma parte de la plantilla global y se cargará cada vez que Word se inicie.

ADVERTISEMENT

Método 2: Guardar y restaurar los valores de los controles usando el registro

Almacenar el formulario en una plantilla global mantiene el formulario activo durante una sesión de Word, pero cerrar Word destruye de nuevo todos los valores en tiempo de ejecución. Si necesita que los valores sobrevivan a un reinicio completo de Word, debe escribirlos en un almacén externo. El registro de Windows es la ubicación más conveniente porque VBA proporciona funciones integradas: SaveSetting, GetSetting, GetAllSettings y DeleteSetting.

Pasos para persistir los valores del formulario de usuario en el registro

  1. Elegir una ruta de clave del registro
    VBA escribe en HKEY_CURRENT_USER\Software\VB and VBA Program Settings\. Use el nombre de su aplicación y el nombre de la sección. Ejemplo: AppName = “MyWordTools”, Section = “UserForm1”.
  2. Guardar los valores de los controles cuando se cierra el formulario
    En el evento UserForm_QueryClose, llame a SaveSetting para cada control. Ejemplo para un cuadro de texto llamado txtName: SaveSetting "MyWordTools", "UserForm1", "Name", txtName.Text. Para una casilla de verificación: SaveSetting "MyWordTools", "UserForm1", "Option", CStr(chkOption.Value).
  3. Restaurar los valores de los controles cuando se abre el formulario
    En el evento UserForm_Initialize, llame a GetSetting para cada control y asigne el valor. Ejemplo: txtName.Text = GetSetting("MyWordTools", "UserForm1", "Name", ""). El cuarto parámetro es el valor predeterminado si la configuración no existe.
  4. Manejar cuadros combinados y cuadros de lista
    Guarde el índice seleccionado o el texto. Para un cuadro combinado: SaveSetting "MyWordTools", "UserForm1", "ComboSel", cboOptions.ListIndex. Restaure estableciendo la propiedad ListIndex.
  5. Probar la persistencia tras reiniciar Word
    Abra Word, ejecute el formulario, introduzca valores, cierre el formulario, cierre Word por completo, vuelva a abrir Word y ejecute el formulario de nuevo. Los controles deben mostrar los valores introducidos anteriormente.

Método 3: Guardar y restaurar los valores de los controles usando un archivo de texto

Si el acceso al registro está restringido en su red, use un archivo de texto simple con formato INI almacenado en la carpeta AppData del usuario. Este método funciona en cualquier configuración de Windows y no requiere permisos de registro.

Pasos para persistir los valores en un archivo de texto

  1. Determinar la ruta del archivo
    Use Environ("APPDATA") & "\MyWordTools\FormSettings.txt". Cree la carpeta si no existe usando la instrucción MkDir.
  2. Escribir una función auxiliar para guardar la configuración
    Abra el archivo para Output, escriba cada nombre de control y valor separados por un delimitador como el carácter de barra vertical. Ejemplo: Print #1, "Name|" & txtName.Text. Cierre el archivo.
  3. Escribir una función auxiliar para cargar la configuración
    Abra el archivo para Input, lea cada línea, divídala por el delimitador y asigne el valor al control correspondiente. Use un bloque Select Case o If para hacer coincidir los nombres de los controles.
  4. Llamar a la función de guardado en QueryClose y a la función de carga en Initialize
    Esto replica el enfoque del registro pero usa un archivo en su lugar. El formulario permanece independiente del documento.

ADVERTISEMENT

Si el formulario de usuario sigue perdiendo datos después de estos métodos

El formulario está almacenado en un módulo de documento en lugar de una plantilla

Si colocó el formulario de usuario en un archivo .docm y cierra ese archivo, el formulario se descarga. Mueva el formulario a Normal.dotm u otra plantilla global. Para verificarlo, abra el editor de VBA y compruebe qué proyecto contiene la carpeta del formulario.

La función SaveSetting no escribe en el registro

En equipos corporativos bloqueados, la escritura en el registro puede estar bloqueada. Use el método del archivo de texto en su lugar. Pruebe ejecutando una llamada simple a SaveSetting en el panel Inmediato: SaveSetting "Test", "Test", "Test", "Hello". Si no se produce ningún error, el registro se puede escribir.

El evento UserForm_Initialize no se desencadena

Este evento solo se ejecuta cuando el formulario se carga en memoria. Si oculta el formulario en lugar de descargarlo, Initialize no se desencadena de nuevo. Use el método Show cada vez que necesite el formulario, o llame a una subrutina personalizada que recargue la configuración antes de mostrar el formulario.

Plantilla global vs registro vs archivo de texto: diferencias clave

Elemento Plantilla global (Normal.dotm) Registro de Windows Archivo de texto (AppData)
Ámbito de persistencia Solo la sesión actual de Word Todas las sesiones y reinicios de Word Todas las sesiones y reinicios de Word
Complejidad de configuración Baja — agregar el formulario a Normal.dotm Media — escribir código SaveSetting/GetSetting Media — escribir código de E/S de archivos
Permiso requerido Acceso de escritura a Normal.dotm Acceso de escritura al registro HKCU Acceso de escritura a la carpeta AppData
Visibilidad de los datos No se almacenan externamente Visible en regedit Visible en el Explorador de archivos
Ideal para Persistencia rápida solo de sesión Entornos empresariales con acceso al registro Equipos bloqueados o perfiles móviles

Ahora puede crear un formulario de usuario VBA de Word que conserve su estado entre sesiones de documento. Comience moviendo el formulario a Normal.dotm para la persistencia de sesión, luego agregue llamadas a SaveSetting y GetSetting para la persistencia completa tras reinicios. Si el acceso al registro está bloqueado, cambie a un archivo de texto almacenado en la carpeta AppData. Para escenarios avanzados, considere almacenar la configuración en una parte XML personalizada dentro del propio documento usando el objeto CustomXMLPart — esto mantiene los datos adjuntos al archivo incluso cuando se envía por correo electrónico.

ADVERTISEMENT