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.
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
- Abra o Editor VBA
Pressione Alt+F11 no Word para abrir o Editor Visual Basic. - Abra Opções
Clique em Ferramentas > Opções. Vá para a guia Geral. - Defina a captura de erros
Selecione “Interromper em erros não tratados”. Clique em OK. - 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
- Insira On Error Resume Next
No topo da Sub, adicione a linhaOn Error Resume Next. Isso instrui o VBA a continuar para a próxima linha mesmo se ocorrer um erro. - 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 - Veja a Janela Imediata
Pressione Ctrl+G para abrir a Janela Imediata. Execute a macro. O erro registrado aparecerá lá. - Restaure o tratamento de erros normal
Após o teste, remova a linhaOn Error Resume Nextou substitua porOn Error GoTo 0.
Etapa 3: Verificar a proteção do documento
- Abra a guia Revisão
No Word, vá em Revisão > Proteger > Restringir Edição. - 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. - 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. - Execute a macro novamente
Se a Sub não parar mais, a proteção era a causa.
Etapa 4: Desabilitar suplementos temporariamente
- 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. - Execute a macro
Se a Sub for concluída sem parar, um suplemento está interferindo. - 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
- Divida a operação em etapas menores
Se a linha com falha forSelection.Find.Execute Replace:=wdReplaceAll, divida em um Find e depois um Replace. - Use referências de objeto explícitas
SubstituaSelectionpor um objeto Range definido:Dim rng As Range
Set rng = ActiveDocument.Content
rng.Find.Execute FindText:="antigo", ReplaceWith:="novo", Replace:=wdReplaceAll - Adicione uma chamada DoEvents
InsiraDoEventsantes da operação com falha para permitir que o Word processe eventos pendentes.
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.