Quando uma macro VBA do Word encontra um erro de tempo de execução, ela para a execução e exibe uma caixa de diálogo de erro padrão. Isso interrompe a operação, muitas vezes deixando o documento em um estado incompleto ou corrompido. A causa é o comportamento padrão de tratamento de erros no VBA, que trata qualquer erro não tratado como uma falha crítica. Este artigo explica como usar a captura estruturada de erros com as instruções On Error Resume Next e On Error GoTo para manter sua macro funcionando sem problemas.
Principais Conclusões: Capture Erros VBA no Word de Forma Elegante
- On Error Resume Next: Instrui o VBA a ignorar um erro de tempo de execução e continuar com a próxima linha de código, ideal para operações não críticas.
- On Error GoTo [Rótulo]: Envia a execução para uma rotina de tratamento de erros rotulada quando ocorre um erro, permitindo registrar ou corrigir o problema.
- Objeto Err (Err.Number, Err.Description, Err.Clear): Fornece detalhes sobre o último erro; use Err.Clear após o tratamento para redefinir o estado do erro.
Como o Tratamento de Erros VBA Funciona em Macros do Word
VBA, a linguagem de macro do Word, usa um modelo de execução sequencial. Quando ocorre um erro em uma linha, o comportamento padrão é parar a macro e mostrar uma caixa de diálogo com o número e a descrição do erro. Isso é controlado pelo manipulador de erros interno do VBA. Para alterar esse comportamento, você insere instruções específicas de tratamento de erros no início do seu procedimento ou antes do bloco de código arriscado.
Os dois métodos principais são a supressão inline de erros com On Error Resume Next e o desvio estruturado de erros com On Error GoTo. Cada um serve a um propósito diferente. On Error Resume Next é melhor quando você espera erros ocasionais que não afetam o resultado geral, como um marcador ausente ou um intervalo protegido. On Error GoTo é melhor quando você precisa registrar o erro, limpar recursos ou sair do procedimento com segurança.
Após capturar um erro, você deve verificar o objeto Err para ver se ocorreu um erro. A propriedade Err.Number retorna o código do erro, e Err.Description retorna a mensagem. Após o tratamento, chame Err.Clear para redefinir o estado do erro. Se você não limpar o erro, chamadas subsequentes de On Error Resume Next ainda verão o erro antigo.
Passos para Implementar On Error Resume Next para Operações Não Críticas
Este método é ideal para operações que podem falhar, mas onde a falha é aceitável, como excluir um marcador que pode não existir ou aplicar formatação a uma seleção que pode estar vazia.
- Abra o editor VBA
Pressione Alt+F11 no Word para abrir o editor Microsoft Visual Basic for Applications. Localize o módulo que contém sua macro no painel do Explorer de Projetos. - Insira a instrução On Error antes do código arriscado
Coloque o cursor no início do procedimento ou logo antes da linha que pode falhar. DigiteOn Error Resume Next. Isso instrui o VBA a ignorar qualquer erro de tempo de execução e passar para a próxima linha. - Escreva a operação que pode falhar
Por exemplo, para excluir um marcador sem travar se ele não existir:ActiveDocument.Bookmarks("Temp").Delete. Se o marcador estiver ausente, a macro continua. - Verifique o objeto Err após a operação
Adicione um blocoIf Err.Number <> 0 Thenpara opcionalmente registrar ou ignorar o erro. Por exemplo:If Err.Number <> 0 Then
Debug.Print "Erro " & Err.Number & ": " & Err.Description
Err.Clear
End If - Restaure o tratamento de erros padrão
Após a seção arriscada, adicioneOn Error GoTo 0para reverter ao tratamento de erros padrão para o restante da macro. Isso garante que erros inesperados posteriores no código não sejam ignorados silenciosamente.
Passos para Implementar On Error GoTo para Tratamento Centralizado de Erros
Use este método quando precisar realizar ações de limpeza ou sair da macro de forma segura após a ocorrência de um erro. Ele centraliza toda a lógica de erro em uma seção rotulada.
- Declare o rótulo de erro no início do procedimento
No topo da sua macro, após a linhaSubouFunction, adicioneOn Error GoTo ErrorHandler. O nome do rótulo pode ser qualquer um, masErrorHandleré padrão. - Escreva o código principal da macro normalmente
Inclua todas as operações necessárias. Se qualquer linha causar um erro, a execução salta imediatamente para o rótulo. - Adicione um Exit Sub ou Exit Function antes do rótulo
ColoqueExit SubouExit Functionlogo antes do rótulo de erro. Isso impede que o código de tratamento de erro seja executado quando nenhum erro ocorrer. - Escreva o bloco de tratamento de erro
DigiteErrorHandler:em sua própria linha. Abaixo, adicione código para tratar o erro. Por exemplo:ErrorHandler:
MsgBox "Erro " & Err.Number & ": " & Err.Description, vbCritical
Resume Next
A instruçãoResume Nextretorna a execução para a linha imediatamente após a que causou o erro. Alternativamente, useResumepara tentar novamente a linha com falha, ouResume ExitHerepara pular para um segundo rótulo que lida com a limpeza. - Limpe o objeto de erro
AdicioneErr.Clearno final do manipulador de erro para redefinir o estado do erro antes que a macro continue ou termine.
Erros Comuns de Captura e Como Evitá-los
Esquecer de restaurar o tratamento de erros padrão após On Error Resume Next
Se você não adicionar On Error GoTo 0 após a seção arriscada, todo o restante da macro será executado com erros suprimidos. Isso pode ocultar bugs e tornar a depuração impossível. Sempre restaure o tratamento padrão assim que a operação arriscada for concluída.
Usar Resume sem um rótulo válido após On Error GoTo
A instrução Resume só pode ser usada dentro de um manipulador de erro ativo. Se você chamar Resume sem um rótulo, ou se o rótulo estiver escrito incorretamente, o VBA gera um novo erro. Certifique-se de que o nome do rótulo corresponda exatamente e que o manipulador esteja acessível.
Não limpar o objeto Err antes da próxima verificação de erro
Se você verificar Err.Number após uma operação, mas não chamar Err.Clear, o próximo bloco On Error Resume Next ainda verá o erro antigo. Isso causa falsos positivos em suas verificações de erro. Sempre limpe o objeto após o tratamento.
On Error Resume Next vs On Error GoTo: Principais Diferenças
| Item | On Error Resume Next | On Error GoTo |
|---|---|---|
| Comportamento do erro | Ignora o erro e continua na próxima linha | Salta para um manipulador rotulado |
| Melhor caso de uso | Falhas esperadas e não críticas | Falhas críticas que precisam de limpeza ou registro |
| Visibilidade do erro | Deve verificar o objeto Err manualmente | Manipulador é executado automaticamente no erro |
| Restauração necessária | Sim, use On Error GoTo 0 | Não é necessário, mas o manipulador deve sair corretamente |
| Opções de Resume | Não aplicável | Resume, Resume Next, Resume [rótulo] |
Agora você tem dois métodos confiáveis para capturar erros VBA no Word sem interromper sua macro. Comece aplicando On Error Resume Next em operações simples e não críticas para evitar interrupções. Para macros mais complexas que exigem limpeza, use On Error GoTo com um manipulador dedicado. Teste suas macros em uma cópia do documento primeiro e sempre verifique o objeto Err após a supressão inline de erros. Uma dica avançada: combine ambos os métodos usando On Error Resume Next para operações individuais dentro de um loop e envolva todo o loop em um manipulador On Error GoTo para capturar erros fatais inesperados.