VBA On Error – Melhores Práticas de Tratamento de Erros
In this Article
Folha de Dicas de Erros do VBA
Erros
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:
- Referência a uma pasta de trabalho, planilha ou outro objeto inexistente (erro de tempo de execução 1004)
- Dados inválidos, por exemplo, referência a uma célula do Excel que contém um erro (Tipos Incompatíveis – Erro de tempo de execução 13)
- Tentativa de dividir por zero
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.
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
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
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:
O VBA Editor também tem uma opção para “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:
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:
Outros exemplos incluem:
- For sem Next
- Select sem End Select
- If sem End If
- Chamada de um procedimento que não existe
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 .
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:
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:
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)
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:
Ao clicar em “Debug”, você verá a linha de código que está gerando o 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