Corrigir Sub VBA do Word Parando no Meio de uma Operação Específica no Documento
🔍 WiseChecker

Corrigir Sub VBA do Word Parando no Meio de uma Operação Específica no Documento

Você executa uma macro VBA no Word e ela para no meio, sempre na mesma operação, como LocalizarSubstituir, ClassificarTabela ou Range.Insert. Esse sintoma aponta para um erro de tempo de execução que o manipulador de erros padrão não captura ou para uma condição que aciona a proteção interna do Word. A causa raiz geralmente é um erro não tratado, uma estrutura de documento protegida ou um conflito entre o VBA e um suplemento em segundo plano. Este artigo explica os motivos técnicos exatos pelos quais uma Sub para no meio da execução e fornece métodos passo a passo para isolar e corrigir a operação com falha.

Principais conclusões: Evite falhas de Sub VBA em operações específicas do documento

  • Editor VBA > Ferramentas > Opções > Geral > Interromper em erros não tratados: Força o depurador a parar na linha exata que falha, revelando o número e a descrição do erro.
  • On Error Resume Next / On Error GoTo 0: Suprime temporariamente erros de tempo de execução para que a macro continue; adicione registro de erros para identificar a operação com falha.
  • Arquivo > Opções > Central de Confiabilidade > Configurações da Central de Confiabilidade > Configurações de Macro > Desabilitar todas as macros com notificação: Desative temporariamente os suplementos que podem interceptar operações do documento e causar uma parada.

ADVERTISEMENT

Por que uma Sub VBA para no meio de uma operação específica

Quando uma Sub VBA para em uma linha específica, como Selection.Find.Execute ou ActiveDocument.Tables(1).Sort, a causa imediata é um erro de tempo de execução que o runtime do VBA não consegue tratar. Sem um manipulador de erros ativo, o VBA exibe uma caixa de mensagem e interrompe a execução. Erros comuns de tempo de execução nesses pontos incluem:

Erro de objeto necessário (Erro 424)

Isso ocorre quando o código faz referência a um objeto que não existe mais. Por exemplo, se a macro exclui uma tabela e depois tenta classificá-la, o objeto tabela desapareceu. A Sub para na linha de classificação.

Método ou membro de dados não encontrado (Erro 438)

Isso acontece quando o código chama um método que o objeto atual não suporta. Por exemplo, chamar .Sort em um Range que abrange várias células de tabela pode falhar se o intervalo não for um objeto Table válido.

Permissão negada (Erro 70) ou erros de documento protegido

Se o documento tiver restrições de edição, campos de formulário ou estiver marcado como final, certas operações como Range.Insert ou Find.Execute com substituição lançarão um erro e interromperão a macro.

Memória insuficiente ou recursos do sistema (Erro 7)

Documentos grandes com muitas alterações controladas ou imagens incorporadas podem esgotar a memória disponível durante uma operação de LocalizarSubstituir, fazendo com que a Sub pare.

Etapas para diagnosticar e corrigir a Sub que para

Siga estas etapas em ordem. Cada etapa isola uma causa possível diferente.

Etapa 1: Ativar Interromper em erros não tratados

  1. Abra o Editor VBA
    Pressione Alt+F11 no Word para abrir o Editor Visual Basic.
  2. Abra Opções
    Clique em Ferramentas > Opções. Vá para a guia Geral.
  3. Defina a captura de erros
    Selecione “Interromper em erros não tratados”. Clique em OK.
  4. Execute a macro novamente
    Quando a Sub parar, o depurador destacará a linha com falha. Anote o número e a descrição do erro na caixa de mensagem.

Etapa 2: Adicionar um manipulador de erros temporário

  1. Insira On Error Resume Next
    No topo da Sub, adicione a linha On Error Resume Next. Isso instrui o VBA a continuar para a próxima linha mesmo se ocorrer um erro.
  2. Registre o erro
    Após a operação que falha, adicione este código para capturar o erro:
    If Err.Number <> 0 Then
        Debug.Print "Erro " & Err.Number & ": " & Err.Description
        Err.Clear
    End If
  3. Veja a Janela Imediata
    Pressione Ctrl+G para abrir a Janela Imediata. Execute a macro. O erro registrado aparecerá lá.
  4. Restaure o tratamento de erros normal
    Após o teste, remova a linha On Error Resume Next ou substitua por On Error GoTo 0.

Etapa 3: Verificar a proteção do documento

  1. Abra a guia Revisão
    No Word, vá em Revisão > Proteger > Restringir Edição.
  2. Revise as configurações de proteção
    Se o painel de tarefas mostrar “Seu documento está protegido”, clique em Parar Proteção. Digite a senha se solicitado.
  3. Verifique se está Marcado como Final
    Vá em Arquivo > Informações > Proteger Documento. Se “Marcar como Final” estiver visível, clique para remover o status final.
  4. Execute a macro novamente
    Se a Sub não parar mais, a proteção era a causa.

Etapa 4: Desabilitar suplementos temporariamente

  1. Abra o Word no Modo de Segurança
    Mantenha pressionada a tecla Ctrl enquanto inicia o Word. Clique em Sim quando perguntado para iniciar no Modo de Segurança. No Modo de Segurança, todos os suplementos estão desabilitados.
  2. Execute a macro
    Se a Sub for concluída sem parar, um suplemento está interferindo.
  3. Identifique o suplemento problemático
    Saia do Modo de Segurança. Vá em Arquivo > Opções > Suplementos. Desabilite os suplementos um por um, reiniciando o Word a cada vez, até que a macro funcione.

Etapa 5: Simplificar a operação com falha

  1. Divida a operação em etapas menores
    Se a linha com falha for Selection.Find.Execute Replace:=wdReplaceAll, divida em um Find e depois um Replace.
  2. Use referências de objeto explícitas
    Substitua Selection por um objeto Range definido:
    Dim rng As Range
    Set rng = ActiveDocument.Content
    rng.Find.Execute FindText:="antigo", ReplaceWith:="novo", Replace:=wdReplaceAll
  3. Adicione uma chamada DoEvents
    Insira DoEvents antes da operação com falha para permitir que o Word processe eventos pendentes.

ADVERTISEMENT

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

“Sub VBA do Word para em Find.Execute, mas funciona manualmente”

O objeto Find pode estar mirando um intervalo recolhido. Defina o intervalo para uma área válida antes de chamar Execute. Por exemplo, rng.Start = 0: rng.End = ActiveDocument.Content.End.

“Macro para em Table.Sort com erro 4605”

Esse erro indica que o método não é válido para o objeto. Certifique-se de que a tabela tenha mais de uma linha e que o intervalo inclua a tabela inteira. Use ActiveDocument.Tables(1).Range em vez de Selection.

“VBA para em Range.Insert com erro 4198”

O comando falhou porque o documento contém alterações controladas. Aceite todas as alterações antes de executar a macro: ActiveDocument.AcceptAll.

“Sub para silenciosamente sem mensagem de erro”

Isso geralmente acontece quando a macro chama End ou Stop dentro de um bloco condicional. Pesquise no código por instruções End ou Stop e comente-as temporariamente.

Métodos de depuração: Editor VBA vs Janela Imediata vs Arquivo de Log

Item Modo de Interrupção do Editor VBA Janela Imediata Debug.Print Arquivo de Log (Escrever em Arquivo de Texto)
Esforço de configuração Nenhum (integrado) Adicionar linhas Debug.Print Adicionar código Open/Print/Close
Mostra a linha exata Sim, destacada Não, apenas mensagens registradas Não, apenas mensagens registradas
Funciona sem interação do usuário Não, para no erro Sim, continua Sim, continua
Melhor para Falha imediata em linha conhecida Erros intermitentes Macros de produção onde você não pode monitorar

Agora você pode identificar o erro de tempo de execução exato que interrompe sua Sub VBA e corrigir a operação específica do documento que o causa. Comece ativando Interromper em erros não tratados para ver o número do erro. Em seguida, aplique o manipulador de erros ou a verificação de proteção que corresponde ao sintoma. Para manutenção contínua de macros, adicione um manipulador de erros simples com registro em cada Sub que mexa no conteúdo do documento. Isso evita paradas silenciosas e fornece um registro de qual operação falhou.

ADVERTISEMENT