Como tratar erros no VBA do Excel: On Error e técnicas de depuração

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:

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *