Como Criar um Userform VBA no Word que Persiste Entre Sessões de Documento
🔍 WiseChecker

Como Criar um Userform VBA no Word que Persiste Entre Sessões de Documento

Você tem um userform VBA personalizado no Word que funciona bem em um documento, mas desaparece ou reseta toda vez que fecha e reabre o arquivo. Isso acontece porque os userforms VBA são armazenados no módulo do documento e são destruídos quando o documento é descarregado. Este artigo explica como projetar um userform VBA que retém seu estado e configurações entre sessões de documento, armazenando dados em um local persistente, como um template, uma chave de registro ou um arquivo de texto simples.

Principais Conclusões: Persistir um Userform VBA do Word Entre Sessões

  • Armazenar o userform em um template global (Normal.dotm): Mantém o formulário e seu código disponíveis em todos os documentos e sessões.
  • Usar SaveSetting e GetSetting do VBA: Grava e lê os valores dos controles do userform no registro do Windows para que sobrevivam ao fechamento do documento.
  • Carregar configurações no UserForm_Initialize: Preenche os controles a partir do registro ou de um arquivo quando o formulário abre, restaurando o último estado.

ADVERTISEMENT

Por que os Userforms VBA Resetam Quando o Documento Fecha

Um userform VBA incorporado em um documento específico (.docm) faz parte do projeto VBA desse documento. Quando o Word fecha o documento, todo o projeto VBA é descarregado da memória. Todos os valores de variáveis, estados dos controles do formulário e quaisquer dados não salvos são perdidos. O formulário em si ainda existe no arquivo do documento, mas seu estado em tempo de execução — como entradas de caixa de texto, seleções de caixa de combinação ou estados de caixa de seleção — desaparece.

O problema central é a diferença entre persistência em tempo de design (o formulário permanece no arquivo) e persistência em tempo de execução (os valores inseridos pelo usuário desaparecem). Para fazer o formulário persistir verdadeiramente entre sessões, você deve separar o código do formulário do ciclo de vida do documento. As duas abordagens confiáveis são:

  • Mover o userform para um template global para que ele permaneça carregado enquanto o Word estiver em execução
  • Salvar e restaurar os valores dos controles usando um mecanismo de armazenamento externo, como o registro do Windows, um arquivo de texto ou uma parte XML personalizada no documento

Método 1: Armazenar o Userform em um Template Global

Um template global como Normal.dotm permanece carregado durante toda a sessão do Word. Qualquer userform colocado em Normal.dotm fica disponível a partir de qualquer documento. Seus controles mantêm seus valores até que o usuário feche o Word ou descarregue o formulário manualmente. Este método é a maneira mais simples de manter um formulário ativo em várias aberturas e fechamentos de documentos dentro da mesma sessão do Word.

Pré-requisitos

  • Acesso ao editor VBA (Alt+F11)
  • Permissão para modificar Normal.dotm — geralmente permitida, a menos que sua política de TI restrinja
  • O código do userform deve ser autocontido e não referenciar propriedades específicas do documento que mudam

Passos para Adicionar o Userform ao Normal.dotm

  1. Abra o editor VBA e localize Normal.dotm
    Pressione Alt+F11. No Project Explorer, procure o projeto chamado “Normal”. Este é o seu template Normal.dotm. Se não vir o Project Explorer, pressione Ctrl+R.
  2. Insira um novo userform no Normal.dotm
    Clique com o botão direito no projeto Normal, selecione Inserir > UserForm. Um formulário em branco aparece no editor. Adicione os controles necessários: caixas de texto, caixas de combinação, caixas de seleção e botões de comando.
  3. Escreva o código do formulário no Normal.dotm
    Clique duas vezes no formulário ou em um controle para abrir o painel de código. Escreva os manipuladores de eventos, como UserForm_Initialize e procedimentos de clique de botão, dentro do projeto Normal. Não use o módulo ThisDocument de nenhum arquivo .docm específico.
  4. Crie uma macro para exibir o formulário
    Insira um módulo padrão no Normal.dotm. Escreva um procedimento Sub como Sub MostrarMeuFormulario() que contenha UserForm1.Show. Atribua esta macro a um botão da faixa de opções ou atalho de teclado para fácil acesso.
  5. Salve Normal.dotm
    O Word solicitará que você salve as alterações no Normal.dotm ao sair. Aceite a solicitação. O formulário agora faz parte do template global e será carregado toda vez que o Word iniciar.

ADVERTISEMENT

Método 2: Salvar e Restaurar Valores dos Controles Usando o Registro

Armazenar o formulário em um template global mantém o formulário ativo durante uma sessão do Word, mas fechar o Word destrói todos os valores em tempo de execução novamente. Se você precisar que os valores sobrevivam a uma reinicialização completa do Word, deve gravá-los em um armazenamento externo. O registro do Windows é o local mais conveniente porque o VBA fornece funções internas: SaveSetting, GetSetting, GetAllSettings e DeleteSetting.

Passos para Persistir Valores do Userform no Registro

  1. Escolha um caminho de chave de registro
    O VBA grava em HKEY_CURRENT_USER\Software\VB and VBA Program Settings\. Use o nome do seu aplicativo e o nome da seção. Exemplo: AppName = “MyWordTools”, Section = “UserForm1”.
  2. Salve os valores dos controles quando o formulário fechar
    No evento UserForm_QueryClose, chame SaveSetting para cada controle. Exemplo para uma caixa de texto chamada txtNome: SaveSetting "MyWordTools", "UserForm1", "Nome", txtNome.Text. Para uma caixa de seleção: SaveSetting "MyWordTools", "UserForm1", "Opcao", CStr(chkOpcao.Value).
  3. Restaure os valores dos controles quando o formulário abrir
    No evento UserForm_Initialize, chame GetSetting para cada controle e atribua o valor. Exemplo: txtNome.Text = GetSetting("MyWordTools", "UserForm1", "Nome", ""). O quarto parâmetro é o valor padrão se a configuração não existir.
  4. Lide com caixas de combinação e caixas de listagem
    Salve o índice selecionado ou o texto. Para uma caixa de combinação: SaveSetting "MyWordTools", "UserForm1", "ComboSel", cboOpcoes.ListIndex. Restaure definindo a propriedade ListIndex.
  5. Teste a persistência após reiniciar o Word
    Abra o Word, execute o formulário, insira valores, feche o formulário, feche o Word completamente, reabra o Word e execute o formulário novamente. Os controles devem mostrar os valores inseridos anteriormente.

Método 3: Salvar e Restaurar Valores dos Controles Usando um Arquivo de Texto

Se o acesso ao registro for restrito em sua rede, use um arquivo de texto simples no estilo INI armazenado na pasta AppData do usuário. Este método funciona em qualquer configuração do Windows e não requer permissões de registro.

Passos para Persistir Valores em um Arquivo de Texto

  1. Determine o caminho do arquivo
    Use Environ("APPDATA") & "\MyWordTools\FormSettings.txt". Crie a pasta se ela não existir usando a instrução MkDir.
  2. Escreva uma função auxiliar para salvar configurações
    Abra o arquivo para Output, escreva cada nome de controle e valor separados por um delimitador, como um caractere pipe. Exemplo: Print #1, "Nome|" & txtNome.Text. Feche o arquivo.
  3. Escreva uma função auxiliar para carregar configurações
    Abra o arquivo para Input, leia cada linha, divida pelo delimitador e atribua o valor ao controle correspondente. Use um bloco Select Case ou If para corresponder aos nomes dos controles.
  4. Chame a função de salvar no QueryClose e a função de carregar no Initialize
    Isso espelha a abordagem do registro, mas usa um arquivo. O formulário permanece independente do documento.

ADVERTISEMENT

Se o Userform Ainda Perder Dados Após Esses Métodos

O formulário está armazenado em um módulo de documento em vez de um template

Se você colocou o userform em um arquivo .docm e fechou esse arquivo, o formulário é descarregado. Mova o formulário para Normal.dotm ou outro template global. Para verificar, abra o editor VBA e veja qual projeto contém a pasta do formulário.

A função SaveSetting não grava no registro

Em computadores corporativos bloqueados, a gravação no registro pode ser impedida. Use o método do arquivo de texto. Teste executando uma chamada SaveSetting simples no painel Imediato: SaveSetting "Test", "Test", "Test", "Hello". Se nenhum erro ocorrer, o registro é gravável.

O evento UserForm_Initialize não é acionado

Este evento é executado apenas quando o formulário é carregado na memória. Se você ocultar o formulário em vez de descarregá-lo, o Initialize não será acionado novamente. Use o método Show cada vez que precisar do formulário ou chame uma sub-rotina personalizada que recarregue as configurações antes de exibir o formulário.

Template Global vs Registro vs Arquivo de Texto: Principais Diferenças

Item Template Global (Normal.dotm) Registro do Windows Arquivo de Texto (AppData)
Escopo de persistência Apenas na sessão atual do Word Entre todas as sessões e reinicializações do Word Entre todas as sessões e reinicializações do Word
Complexidade de configuração Baixa — adicionar formulário ao Normal.dotm Média — escrever código SaveSetting/GetSetting Média — escrever código de E/S de arquivo
Permissão necessária Acesso de gravação ao Normal.dotm Acesso de gravação ao registro HKCU Acesso de gravação à pasta AppData
Visibilidade dos dados Não armazenado externamente Visível no regedit Visível no Explorador de Arquivos
Melhor para Persistência rápida apenas na sessão Ambientes corporativos com acesso ao registro Computadores bloqueados ou perfis móveis

Agora você pode criar um userform VBA no Word que mantém seu estado entre sessões de documento. Comece movendo o formulário para Normal.dotm para persistência na sessão e, em seguida, adicione chamadas SaveSetting e GetSetting para persistência total após reinicialização. Se o acesso ao registro estiver bloqueado, mude para um arquivo de texto armazenado na pasta AppData. Para cenários avançados, considere armazenar as configurações em uma parte XML personalizada dentro do próprio documento usando o objeto CustomXMLPart — isso mantém os dados anexados ao arquivo mesmo quando enviado por e-mail.

ADVERTISEMENT