VBA On Error – Melhores Práticas de Tratamento de Erros

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Daniel Caramello

Last updated on June 21, 2023

Folha de Dicas de Erros do VBA

Erros

Descrição
Código VBA
On Error – Interrompe o código e exibe o erro
On Error Goto 0
On Error – Ignorar o erro e continuar a execução
On Error Resume Next
On Error – Ir para uma linha de código [rótulo]
On Error Goto [rótulo]
Limpa (reinicia) o erro
On Error GoTo –1
Show Error number
MsgBox Err.Number
Show Description of error
MsgBox Err.Description
Função para gerar seu próprio erro
Err.Raise

Veja mais “Folhas de Dicas” do VBA e downloads gratuitos de PDFs

Tratamento de Erros do VBA

O tratamento de erros do VBA refere-se ao processo de antecipação, detecção e resolução de erros de tempo de execução do VBA. O processo de tratamento de erros do VBA ocorre ao escrever o código, antes que qualquer erro ocorra de fato.

Os erros de tempo de execução do VBA são erros que ocorrem durante a execução do código. Exemplos de erros de tempo de execução incluem:

Declaração de Erro do VBA

A maior parte do tratamento de erros do VBA é feita com a instrução On Error. A instrução On Error informa ao VBA o que fazer se encontrar um erro. Há três instruções On Error:

  • On Error GoTo 0
  • On Error Resume Next
  • On Error GoTo Linha

On Error GoTo 0

On Error GoTo 0 é a configuração padrão do VBA. Você pode restaurar essa configuração padrão adicionando a seguinte linha de código:

On Error GoTo 0

Quando ocorrer um erro com On Error GoTo 0, o VBA interromperá a execução do código e exibirá sua caixa de mensagem de erro padrão.

erro tipos incompativeis

Geralmente, você adicionará um On Error GoTo 0 depois de adicionar o tratamento de erros On Error Resume Next (próxima seção):

Sub ExemploErrorGoTo0()

On Error Resume Next
    ActiveSheet.Shapes("Botao_Inicio").Delete
On Error GoTo 0

'Rodar mais código

End Sub

On Error Resume Next

On Error Resume Next diz ao VBA para ignorar as linhas de código que contêm erros e prosseguir para a próxima linha.

On Error Resume Next

Observação: On Error Resume Next não corrige um erro nem o resolve de outra forma. Ele simplesmente diz ao VBA para prosseguir como se a linha de código que contém o erro não existisse. O uso inadequado de On Error Resume Next pode resultar em consequências não intencionais.

Um ótimo momento para usar On Error Resume Next é quando se trabalha com objetos que podem ou não existir. Por exemplo, você deseja escrever um código que excluirá uma forma, mas se executar o código quando a forma já tiver sido excluída, o VBA emitirá um erro. Em vez disso, você pode usar On Error Resume Next para dizer ao VBA para excluir a forma se ela existir.

On Error Resume Next
    ActiveSheet.Shapes("Botao_Inicio").Delete
On Error GoTo 0

Observe que adicionamos On Error GoTo 0 após a linha de código que contém o erro em potencial. Isso redefine o tratamento de erros.

Na próxima seção, mostraremos como testar se ocorreu um erro usando Err.Number, o que lhe dará opções mais avançadas de tratamento de erros.

Err.Number, Err.Clear e Captura de Erros

Em vez de simplesmente pular uma linha que contém um erro, podemos capturar o erro usando On Error Resume Next e Err.Number.

Err.Number retorna um número de erro correspondente ao tipo de erro detectado. Se não houver erro, Err.Number = 0.

Por exemplo, esse procedimento retornará “11” porque o erro que ocorre é o erro de tempo de execução ’11’.

Sub ErrorNumber_exemplo()

On Error Resume Next
ActiveCell.Value = 2 / 0
MsgBox Err.Number

End Sub

erro divisao zero

Tratamento de Erros com Err.Number

O verdadeiro poder do Err.Number está na capacidade de detectar se ocorreu um erro (Err.Number <> 0). No exemplo abaixo, criamos uma função que testará se existe uma planilha usando Err.Number.

Sub TesteWS()
    MsgBox PlanilhaExiste("teste")
End Sub

Function PlanilhaExiste(wsName As String) As Boolean
    Dim ws As Worksheet
    
    On Error Resume Next
    Set ws = Sheets(wsName)
    
    'Se houver erro a planilha não existe
    If Err.Number <> 0 Then
        PlanilhaExiste = False
    Else
        PlanilhaExiste = True
    End If

    On Error GoTo -1
End Function

Observação: Adicionamos um On Error GoTo -1 ao final, que redefine Err.Number para 0 (veja duas seções abaixo).

Com On Error Resume Next e Err.Number, você pode replicar a funcionalidade “Try” e “Catch” de outras linguagens de programação.

On Error GoTo Linha

On Error GoTo Linha diz ao VBA para “ir para” uma linha de código rotulada quando um erro é encontrado. Você declara a instrução Go To da seguinte forma (onde errGerenciador é o rótulo da linha para a qual ir):

On Error GoTo errGerenciador

e cria um rótulo de linha como este:

errGerenciador:

Observação: esse é o mesmo rótulo que você usaria com uma instrução GoTo do VBA comum.

A seguir, demonstraremos como usar On Error GoTo Linha para sair de um procedimento.

On Error Exit Sub

Você pode usar On Error GoTo Linha para sair de uma subseção quando ocorrer um erro.

Para isso, coloque o rótulo da linha do manipulador de erros no final do procedimento:

Sub ErrIrParaFim()

On Error GoTo fimProc

'Algum código
    
fimProc:
End Sub

ou usando o comando Exit Sub:

Sub ErrIrParaFim()

On Error GoTo fimProc

'Algum código
GoTo pularSaida
    
fimProc:
Exit Sub

pularSaida:

'Mais algum código

End Sub

Err.Clear, On Error GoTo -1 e Limpando Err.Number

Depois que um erro é tratado, você geralmente deve limpar o erro para evitar problemas futuros com o tratamento de erros.

Após a ocorrência de um erro, tanto Err.Clear quanto On Error GoTo -1 podem ser usados para redefinir Err.Number para 0. Mas há uma diferença muito importante: Err.Clear não redefine o erro em si, apenas redefine o Err.Number.

O que isso significa? Usando Err.Clear, você não poderá alterar a configuração de tratamento de erros. Para ver a diferença, teste este código e substitua On Error GoTo -1 por Err.Clear:

Sub ErrExemplos()

    On Error GoTo errHandler:
        
    'Erro "definido pelo aplicativo"
    Error (13)
    
Exit Sub
errHandler:
    ' Limpar Erro
    On Error GoTo -1
    
    On Error GoTo errHandler2:
    
    'Erro "tipos incompatíveis" error
    Error (1034)
    
Exit Sub
errHandler2:
    Debug.Print Err.Description
End Sub

Normalmente, recomendo sempre usar On Error GoTo -1, a menos que você tenha um bom motivo para usar Err.Clear.

VBA On Error MsgBox

Talvez você também queira exibir uma caixa de mensagem em caso de erro. Este exemplo exibirá caixas de mensagem diferentes, dependendo de onde o erro ocorrer:

Sub ErroMensagemExemplo()
 
Dim errMsg As String
On Error GoTo errHandler

    'Estágio 1
    errMsg = "Ocorreu um erro durante o estágio de Copiar e Colar."
    'Err.Raise (11)
    
    'Estágio 2
    errMsg = "Ocorreu um erro durante o estágio de validação de dados."
    'Err.Raise (11)
     
    'Estágio 3
    errMsg = "Ocorreu um erro durante o estágio de construção e cópia de P&L."
    Err.Raise (11)
     
    'Estágio 4
    errMsg = "Ocorreu um erro ao tentar registrar a importação na página de configuração"
    'Err.Raise (11)

    GoTo endProc
    
errHandler:
    MsgBox errMsg
   
endProc:
End Sub

Aqui você substituiria Err.Raise(11) pelo seu código real.

VBA IsError

Outra maneira de lidar com erros é testá-los com a função ISERROR do VBA. A função ISERROR testa uma expressão em busca de erros, retornando TRUE ou FALSE se ocorrer um erro.

Sub IsErrorExemplo()
    MsgBox IsError(Range("a7").Value)
End Sub

If Error VBA

Você também pode tratar erros no VBA com a função IFERROR do Excel. A função IFERROR deve ser acessada usando a classe WorksheetFunction:

Sub IfErrorExemplo()

Dim n As Long
n = WorksheetFunction.IfError(Range("a10").Value, 0)

MsgBox n
End Sub

Isso produzirá o valor do intervalo A10; se o valor for um erro, ele produzirá 0.

Tipos de Erro do VBA

Erros de Tempo de Execução

Conforme mencionado acima:

Os erros de tempo de execução do VBA são erros que ocorrem durante a execução do código. Exemplos de erros de tempo de execução incluem:

  • Referência a uma pasta de trabalho, planilha ou outro objeto inexistente
  • Dados inválidos, por exemplo, referência a uma célula do Excel que contém um erro
  • Tentativa de dividir por zero

erro tipos incompativeis

Você pode “tratar erros” de tempo de execução usando os métodos discutidos acima.

Erros de Sintaxe

Os erros de sintaxe do VBA são erros de escrita de código. Exemplos de erros de sintaxe incluem:

  • Erro de ortografia
  • Falta de pontuação ou pontuação incorreta

O VBA Editor identifica muitos erros de sintaxe com destaque em vermelho:

exemplo erro sintaxe

O VBA Editor também tem uma opção para “Autoverificar Sintaxe”:

opcao autoverificar sintaxe

Quando essa opção estiver marcada, o VBA Editor gerará uma caixa de mensagem alertando sobre erros de sintaxe depois que você inserir uma linha de código:

mensagem erro compilacao

Pessoalmente, considero isso extremamente irritante e desativei o recurso.

Erros de Compilação

Antes de tentar executar um procedimento, o VBA “compilará” o procedimento. A compilação transforma o programa de código-fonte (que você pode ver) em formato executável (que você não pode ver).

Os erros de compilação do VBA são erros que impedem a compilação do código.

Um bom exemplo de um erro de compilação é uma declaração de variável ausente:

erro compilacao faltando

variavel nao definida

Outros exemplos incluem:

  • For sem Next
  • Select sem End Select
  • If sem End If
  • Chamada de um procedimento que não existe

if sem endif

Os Erros de sintaxe (seção anterior) são um subconjunto dos Erros de compilação.

Depurar > Compilar

Os erros de compilação serão exibidos quando você tentar executar um procedimento. Mas o ideal seria identificar os erros de compilação antes de tentar executar o procedimento.

Você pode fazer isso compilando o projeto com antecedência. Para isso, vá para Depurar > Compilar VBAProject .

compilar vba project

O compilador vai “ir para” o primeiro erro. Depois de corrigir esse erro, compile o projeto novamente. Repita até que todos os erros sejam corrigidos.

Você pode saber que todos os erros foram corrigidos porque a opção Compilar VBAProject ficará acinzentada:

compila vbaproject acinzentado

Erro de Estouro

O Erro de Estouro do VBA ocorre quando você tenta colocar um valor em uma variável que é muito grande. Por exemplo, as variáveis inteiras só podem conter valores entre -32.768 e 32.768. Se você inserir um valor maior, receberá um erro de estouro:

erro de estouro

Em vez disso, você deve usar a variável Long para armazenar o número maior.

Outros Termos de Erro do VBA

Catch Error do VBA

Ao contrário de outras linguagens de programação, no VBA não há Catch Statement. No entanto, você pode replicar uma Catch Statement usando On Error Resume Next e If Err.Number <> 0 Then. Isso foi abordado acima em Tratamento de erros com Err.Number.

Ignorar Erro no VBA

Para ignorar erros no VBA, basta usar o comando On Error Resume Next declaração:

On Error Resume Next

Entretanto, conforme mencionado acima, você deve ter cuidado ao usar essa instrução, pois ela não corrige um erro, apenas ignora a linha de código que contém o erro.

VBA Lançar Erro / Err.Raise

Para lançar um erro no VBA, você usa o método Err.Raise.

Esta linha de código levantará o erro de tempo de execução ’13’: Type mismatch:

Err.Raise (13)

erro tipos incompativeis

VBA Error Trapping

VBA Error Trapping é apenas outro termo para o tratamento de erros do VBA.

Mensagem de Erro do VBA

Uma mensagem de erro do VBA é semelhante a esta:

erro tipos incompativeis

Ao clicar em “Debug”, você verá a linha de código que está gerando o erro:

janela depurar erro

Tratamento de Erros do VBA em um Loop

A melhor maneira de tratar erros em um loop é usar On Error Resume Next junto com Err.Number para detectar se ocorreu um erro (lembre-se de usar Err.Clear para limpar o erro após cada ocorrência).

O exemplo abaixo dividirá dois números (Coluna A pela Coluna B) e produzirá o resultado na Coluna C. Se houver um erro, o resultado será 0.

Sub teste()
Dim cell As Range

On Error Resume Next
For Each cell In Range("a1:a10")

    'Definir valor da célula
    cell.Offset(0, 2).Value = cell.Value / cell.Offset(0, 1).Value
    
    'Se Cell.Value for Erro, o padrão será 0
    If Err.Number <> 0 Then
         cell.Offset(0, 2).Value = 0
         Err.Clear
    End If
 Next
End Sub

Tratamento de Erros do VBA no Access

Todos os exemplos acima funcionam exatamente da mesma forma no Access VBA e no Excel VBA.

Function DelRecord(frm As Form)
'essa função é usada para excluir um registro em uma tabela a partir de um formulário
   On Error GoTo ending
   With frm
      If .NewRecord Then
         .Undo
         Exit Function
      End If
   End With
   With frm.RecordsetClone
      .Bookmark = frm.Bookmark
      .Delete
      frm.Requery
   End With
   Exit Function
   ending:
   End
End Function

vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA