Por que a Sub VBA do Word para no meio da execução sem mensagem de erro
🔍 WiseChecker

Por que a Sub VBA do Word para no meio da execução sem mensagem de erro

Você executa uma macro VBA no Word e ela para no meio do código sem mostrar nenhum erro. A macro simplesmente interrompe, sem caixa de diálogo ou depurador. Esse comportamento não é uma falha aleatória. É causado por configurações específicas do VBA, condições de tempo de execução não tratadas ou pela forma como o Word gerencia memória e referências de objetos. Este artigo explica as causas raiz da terminação silenciosa de macros e fornece etapas práticas para evitá-la.

Principais conclusões: Impedir que macros VBA do Word parem silenciosamente

  • Ferramentas > Macros > Macros > Selecionar macro > Depurar (F8): Use a execução passo a passo para identificar a linha exata onde a execução para.
  • Editor VBA > Ferramentas > Opções > Geral > Interromper em erros não tratados: Ativa o depurador para capturar erros que, de outra forma, causam terminação silenciosa.
  • Editor VBA > Depurar > Compilar VBAProject: Encontra erros de sintaxe e tempo de compilação antes da execução da macro.

ADVERTISEMENT

Por que uma Sub VBA para sem caixa de diálogo de erro

Macros VBA do Word param silenciosamente por três motivos principais: um erro de tempo de execução não tratado que não aciona o manipulador de erros padrão, uma chamada DoEvents ou Application.Wait que permite que a interação do usuário cancele a macro, ou uma referência de objeto corrompida ou ausente que faz o Word pular o código restante. Cada causa tem um mecanismo diferente.

Erros de tempo de execução não tratados com On Error Resume Next

Quando uma macro usa On Error Resume Next, qualquer erro após essa linha não mostra uma caixa de diálogo. O código continua até encontrar outro erro que a instrução resume não pode contornar. Se o erro ocorrer dentro de um loop ou bloco condicional, a macro pode sair do procedimento antecipadamente sem aviso. A propriedade Err.Number contém o código do erro, mas se o código não a verificar, o erro fica invisível.

DoEvents e cancelamento pelo usuário

A função DoEvents cede a execução ao sistema operacional para que o usuário possa interagir com o Word. Se o usuário pressionar Escape ou clicar em um botão que interrompa a macro, o Word pode encerrar a sub sem mensagem de erro. Da mesma forma, Application.Wait pausa a execução, mas não protege contra cancelamento pelo usuário.

Perda de referência de objeto

Se uma macro define uma variável de objeto como Nothing ou se o Word libera o objeto devido a uma chamada de método com falha, as linhas subsequentes que referenciam esse objeto causam uma falha silenciosa. O Word nem sempre gera um erro capturável para Variável de objeto ou variável de bloco With não definida em todos os contextos. A macro para na linha que tenta usar o objeto inválido.

Etapas para identificar e corrigir paradas silenciosas de macros

Executar a macro linha por linha

  1. Abra o Editor VBA
    Pressione Alt+F11 no Word para abrir o Editor Visual Basic. Localize o módulo que contém a macro que está parando no painel do Project Explorer.
  2. Defina um ponto de interrupção no início
    Clique na margem esquerda ao lado da primeira linha executável da Sub. Um ponto vermelho aparece. A macro pausará antes de executar essa linha.
  3. Execute a macro e pressione F8 repetidamente
    Pressione F8 para executar uma linha de cada vez. Observe o destaque amarelo. Quando o destaque desaparecer e o editor retornar ao normal, essa é a linha onde a execução parou. Anote o número da linha e o código.

Ativar Interromper em erros não tratados

  1. Abra as opções do Editor VBA
    No Editor VBA, vá em Ferramentas > Opções. Clique na guia Geral.
  2. Selecione Interromper em erros não tratados
    Em Captura de erros, escolha Interromper em erros não tratados. Clique em OK. Essa configuração força o depurador a parar em qualquer erro que não seja capturado por uma instrução On Error.
  3. Execute a macro novamente
    Pressione F5 para executar a macro. Se ocorrer um erro, o depurador agora mostra a linha e a descrição do erro.

Compilar o projeto VBA

  1. Abra o Editor VBA
    Pressione Alt+F11.
  2. Execute Compilar VBAProject
    Vá em Depurar > Compilar VBAProject. O editor verifica todos os módulos em busca de erros de sintaxe, variáveis não declaradas (se Option Explicit estiver definido) e incompatibilidades de tipo. Se aparecer um erro de compilação, corrija-o e compile novamente até que nenhum erro seja relatado.

Verificar On Error Resume Next sem tratamento de erros

  1. Pesquise o código por On Error Resume Next
    Pressione Ctrl+F no Editor VBA e pesquise por On Error Resume Next. Examine cada ocorrência.
  2. Adicione verificação de erros após operações arriscadas
    Após cada linha que pode falhar, insira If Err.Number <> 0 Then para registrar ou tratar o erro. Exemplo:
    On Error Resume Next
    Selection.TypeText Text:=algumaVariavel
    If Err.Number <> 0 Then
       Debug.Print "Erro " & Err.Number & ": " & Err.Description
       Err.Clear
    End If

Remover DoEvents dentro de loops

  1. Localize chamadas DoEvents
    Pressione Ctrl+F e pesquise por DoEvents. Se a macro contiver DoEvents dentro de um loop, comente-a adicionando uma aspa simples no início da linha.
  2. Substitua por atualizações de Application.StatusBar
    Em vez de DoEvents, use Application.StatusBar = "Processando item " & i para dar feedback sem ceder o controle ao usuário.

Verificar se variáveis de objeto não são Nothing

  1. Adicione verificações explícitas antes de usar objetos
    Antes de chamar um método ou propriedade em uma variável de objeto, insira If Not objVar Is Nothing Then. Exemplo:
    Dim doc As Document
    Set doc = Documents.Open("C:\teste.docx")
    If Not doc Is Nothing Then
       doc.SaveAs2 "C:\teste2.docx"
    End If

ADVERTISEMENT

Se a macro ainda parar após as correções principais

Word congela ou trava durante uma macro de longa duração

Uma macro que percorre centenas de parágrafos ou tabelas pode esgotar a memória interna do Word. O Word pode parar de executar a sub sem um erro e ficar sem resposta. Para corrigir, adicione Application.ScreenUpdating = False no início da macro e defina-o de volta para True no final. Reduza também o número de objetos Selection usando objetos Range diretos.

Exibição Protegida bloqueia o objeto Documento

Se a macro abrir um documento de um anexo de e-mail ou compartilhamento de rede, o Word o abre no Modo de Exibição Protegida. O objeto Document é somente leitura, e qualquer tentativa de modificá-lo causa uma falha silenciosa. Use Documents.Open FileName:=caminho, ReadOnly:=False e verifique a propriedade Document.ProtectedViewWindow. Se o documento estiver no Modo de Exibição Protegida, habilite a edição via ActiveProtectedViewWindow.Edit antes de executar a macro.

Conflitos de suplementos causam terminação precoce

Suplementos de terceiros podem interceptar a execução do VBA e interromper uma sub. Para testar, inicie o Word no modo de segurança: pressione a tecla Windows + R, digite winword /safe e pressione Enter. Execute a macro. Se ela for concluída sem parar, desative os suplementos um por um em Arquivo > Opções > Suplementos > Gerenciar Suplementos COM.

Item Parada silenciosa (sem caixa de erro) Caixa de erro (com opção de depuração)
On Error Resume Next ativo Sim, erro é suprimido Não
Configuração Interromper em erros não tratados Desabilitada Habilitada
DoEvents ou Application.Wait usado Sim, usuário pode cancelar Não
Variável de objeto definida como Nothing Sim, código para na próxima linha Às vezes, depende do contexto

Agora você pode diagnosticar por que uma sub VBA do Word para no meio da execução sem mensagem de erro. Primeiro, ative Interromper em erros não tratados nas opções do Editor VBA. Em seguida, execute a macro passo a passo com F8 para localizar a linha com falha. Verifique se há On Error Resume Next sem tratamento de erros e substitua DoEvents por atualizações da barra de status. Para depuração avançada, use o painel Imediato para imprimir Err.Number após cada linha suspeita. Essa abordagem elimina suposições e dá a você controle total sobre a execução da macro.

ADVERTISEMENT