Uma macro que para de funcionar na metade por causa de um erro inesperado é frustrante e pode até causar problemas nos dados da planilha. O tratamento de erros no VBA é o que diferencia uma macro amadora de uma macro profissional. Neste artigo iremos mostrar como usar o On Error no VBA, como depurar o seu código e como criar macros que se comportam de forma elegante mesmo quando algo dá errado.
O que é tratamento de erros?
Tratamento de erros é o conjunto de técnicas usadas para capturar e lidar com situações inesperadas que ocorrem durante a execução do código. Sem tratamento de erros, quando algo inesperado acontece, o VBA para a execução da macro, exibe uma mensagem de erro técnica e o usuário não entende o que fazer.
Com tratamento de erros, você controla o que acontece quando um erro ocorre: pode exibir uma mensagem amigável, registrar o erro em um log, tentar uma alternativa ou encerrar a macro de forma organizada.
On Error GoTo: redirecionando para uma rotina de erro
A forma mais estruturada de tratar erros no VBA é usando o On Error GoTo para redirecionar o código para uma rotina específica quando um erro ocorre:
Sub ExemploTratamentoErro()
On Error GoTo TratarErro
' código normal da macro aqui
Dim valor As Integer
valor = 10 / 0 ' isso vai gerar um erro de divisão por zero
MsgBox "Valor: " & valor
Exit Sub ' sai antes da rotina de erro
TratarErro:
MsgBox "Ocorreu um erro: " & Err.Description, vbCritical, "Erro"
End Sub
O Exit Sub antes do rótulo TratarErro é fundamental: ele garante que a rotina de erro não seja executada quando o código termina normalmente.
Propriedades do objeto Err
Quando um erro ocorre, o VBA preenche o objeto Err com informações sobre o erro:
- Err.Number: o número do erro
- Err.Description: a descrição do erro em texto
- Err.Source: onde o erro ocorreu
Você pode usar essas informações para tratar erros específicos de forma diferente:
TratarErro:
If Err.Number = 11 Then
MsgBox "Erro de divisão por zero. Verifique os dados de entrada."
ElseIf Err.Number = 1004 Then
MsgBox "Erro ao acessar a planilha. Verifique se ela existe."
Else
MsgBox "Erro inesperado: " & Err.Description
End If
On Error Resume Next: ignorando erros
O On Error Resume Next faz com que o VBA ignore o erro e continue executando a próxima linha de código. Deve ser usado com muito cuidado e apenas em situações específicas onde você sabe que um erro pode ocorrer e é aceitável ignorá-lo:
Sub VerificarSeArquivoExiste()
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks.Open("C:\Dados\Arquivo.xlsx")
On Error GoTo 0 ' reativa o tratamento de erros normal
If wb Is Nothing Then
MsgBox "O arquivo não foi encontrado.", vbExclamation
Else
MsgBox "Arquivo aberto com sucesso!"
wb.Close
End If
End Sub
Note o On Error GoTo 0 logo após a linha que pode gerar o erro. Ele reativa o tratamento normal de erros para que outros erros não sejam ignorados.
Depurando o código com o editor de VBA
O editor de VBA tem ferramentas poderosas para depurar o código:
Breakpoints
Clique na margem esquerda do editor, ao lado de uma linha de código, para inserir um breakpoint (ponto de interrupção). Quando a macro chegar àquela linha, ela vai pausar a execução e você pode examinar o estado das variáveis naquele momento.
F8: execução linha a linha
Com a macro pausada em um breakpoint, pressione F8 para executar linha a linha. Isso permite acompanhar exatamente o que está acontecendo a cada passo.
Janela Imediato
A janela Imediato (Ctrl+G no editor) permite imprimir valores de variáveis durante a execução usando Debug.Print:
Debug.Print "O valor da variável é: " & minhaVariavel
Isso é muito útil para verificar o conteúdo de variáveis sem precisar usar MsgBox, que interrompe a execução.
Registrando erros em uma planilha de log
Em macros mais profissionais, é uma boa prática registrar os erros que ocorrem em uma planilha de log, para que você possa investigar depois:
TratarErro:
Dim wsLog As Worksheet
Set wsLog = ThisWorkbook.Worksheets("Log")
Dim ultimaLinha As Long
ultimaLinha = wsLog.Cells(wsLog.Rows.Count, 1).End(xlUp).Row + 1
wsLog.Cells(ultimaLinha, 1).Value = Now()
wsLog.Cells(ultimaLinha, 2).Value = Err.Number
wsLog.Cells(ultimaLinha, 3).Value = Err.Description
MsgBox "Ocorreu um erro e ele foi registrado no log.", vbCritical
Boas práticas de tratamento de erros
Sempre inclua tratamento de erros em macros que serão usadas por outras pessoas. Use mensagens de erro claras e amigáveis, sem jargões técnicos. Sempre reative o tratamento normal de erros com On Error GoTo 0 depois de usar On Error Resume Next. Nunca ignore erros sem verificar se eles realmente ocorreram. E em macros que fazem alterações importantes nos dados, inclua uma verificação no início para garantir que as condições necessárias estão presentes antes de prosseguir.
Se você curtiu esse artigo onde mostramos como tratar erros no VBA do Excel, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.