GoTo no VBA – Tratamento de Erros e Redirecionamento Dentro dos Códigos

Você sabe usar a ferramenta GoTo no VBA? Aprenda agora a fazer o tratamento dos erros e redirecionamentos no código!

O On Error GoTo no VBA desvia a execução para um rótulo quando ocorre um erro, no lugar da mensagem padrão. Declare On Error GoTo TratamentoErro antes da linha que pode falhar, crie o rótulo no fim da macro com a MsgBox desejada e use Exit Sub antes dele para o código não cair no tratamento sem erro.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso Canal do YouTube para mais vídeos!

GoTo no VBA

O que você aprende neste vídeo

Resposta rápida: O vídeo mostra como usar On Error GoTo para desviar um erro do VBA a um tratamento próprio. A estrutura inclui um rótulo, uma mensagem clara, Exit Sub quando a macro termina normalmente, Resume para continuar com segurança e On Error GoTo 0 para restaurar o tratamento padrão.

Neste vídeo (17 min):

  • 0:00 - Cenário de busca com PROCV no VBA e erro causado por um ID inexistente
  • 2:00 - Depuração para identificar exatamente a linha que gera o erro
  • 3:00 - Declaração de On Error GoTo TratamentoErro antes da instrução arriscada
  • 4:00 - Criação do rótulo TratamentoErro: para receber o desvio da execução
  • 5:00 - Exibição de uma mensagem própria com MsgBox no lugar do alerta padrão
  • 6:00 - Personalização da mensagem com o valor que não foi encontrado
  • 8:00 - Uso de Exit Sub para impedir que uma execução sem erro caia no tratamento
  • 10:00 - Retomada controlada com Resume em um rótulo de continuação
  • 12:00 - Limitação do tratamento personalizado apenas às linhas que podem falhar
  • 14:00 - Risco de loop infinito quando o próprio caminho de continuação volta a gerar erro
  • 15:00 - Restauração do comportamento padrão com On Error GoTo 0
  • 16:00 - Estrutura final para combinar tratamento específico e erros posteriores da macro

Trechos do vídeo:

  • O tratamento deve ser ativado imediatamente antes da linha que pode falhar.
  • Sem Exit Sub, a execução normal continua até o rótulo e mostra uma mensagem de erro indevida.
  • Depois do trecho protegido, On Error GoTo 0 devolve ao VBA o tratamento padrão.

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

GoTo no VBA – Tratamento de Erros

A ideia é que você consiga fazer o tratamento correto para cada erro, caso contrário o VBA vai mostrar uma mensagem padrão de erro, só que muitas das vezes isso não é o cenário ideal.

É importante que você defina como esse erro será tratado ou até mesmo que informe uma mensagem mais detalhada ao usuário do motivo daquele erro.

Pois nem sempre quem for utilizar seu código vai saber do que se trata o erro, por não ter conhecimento.

Anteriormente, fizemos uma aula sobre VLookUp VBA onde construímos uma planilha e hoje vamos usar esta mesma planilha para corrigir um erro usando o Go To.

Base de dados
Base de dados

Esta planilha funciona assim, basicamente estamos buscando a quantidade de Views usando o ID.

Colocamos o ID onde está escrito “Teste” e rodamos a macro, a planilha nos fornece a quantidade de Views referente aquele ID.

É bastante simples, mas, imagine se, escrevêssemos “teste” ao invés de um ID válido?

Isso resultaria em uma mensagem de ERRO, a caixa de erro padrão do VBA tem a opção Depurar, clique em depurar para ver onde o erro está acontecendo no nosso código.

GoTo no VBA
Erro

Agora que sabemos a linha onde está ocorrendo o erro vamos aprender como tratar.

Antes da linha onde o erro está ocorrendo vamos escrever “On Error GoTo” que é o mesmo que dizer “se houver erro vá para”, logo em seguida digite o local para onde o código deve ir caso o erro exista, neste caso -> TratamentoErro.

Logo depois do código, após o Next, vamos colocar TratamentoErro, porque será a posição para onde o código irá, como determinamos na linha do GoTo no VBA.

Código

VBA
Sub vlookupVBA()

On Error GoTo TratamentoErro

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

'For linha = 2 To 501
'    If Range("A" & linha).Value = Range("E1").Value Then
'        Range("E2").Value = Range("B" & linha).Value
'        Exit For
'    End If
'Next

TratamentoErro:
End sub

Fazendo isso, ele já está indo para o final da macro quando acontece o erro, e não mostra mais a caixinha de erro que era mostrada. Precisamos fazer um tratamento do erro adequado agora.

Para isso logo abaixo de TratamentoErro no final da macro vamos colocar uma indentação e inserir uma “MsgBox” uma mensagem para o usuário -> “Deu erro!”.

Ícone VBAVBA Impressionador

Como automatizar praticamente qualquer tarefa repetitiva que você faça dentro do Excel. Aprenda a criar integrações do Excel com o PowerPoint, Word, Outlook e muito mais. Aprenda a criar automações para resolver tudo com apenas um clique em um botão. Tudo isso com uma única linguagem que junta todos esses programas.

Começar agoraSeta para a direita
Fundo VBATelas VBA
VBA
Sub vlookupVBA()

On Error GoTo TratamentoErro

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

'For linha = 2 To 501
'    If Range("A" & linha).Value = Range("E1").Value Then
'        Range("E2").Value = Range("B" & linha).Value
'        Exit For
'    End If
'Next

TratamentoErro:
        <strong>MsgBox “Deu erro!”</strong>
End sub

Agora, assim que o erro da linha é identificado o código pula para o final e imprime uma caixinha com a mensagem “Deu erro!”.

Podemos personalizar esta mensagem deixando a sua informação mais completa:

Codigo
TratamentoErro:

MsgBox “Deu erro ao tentar encontrar o valor “”” & Range (“el”).Value & “”””

End Sub

Dessa forma a mensagem vai aparecer desta forma:

  • Deu erro ao tentar encontrar o valor “teste”

A mensagem ficou mais personalizada, porém, se fizermos um teste com um valor que existe na tabela a mesma mensagem vai aparecer, da forma que está configurada a mensagem de erro está aparecendo com ou sem o erro no código.

Como ajustar isso?

Vamos completar o nosso tratamento de erro, nós precisamos que o código rode e que, se não houver erro ele saia antes de chegar no tratamento de erro que fizemos, para isso vamos usar o Exit Sub logo abaixo do For antes do TratamentoErro

VBA
Sub vlookupVBA()

On Error GoTo TratamentoErro

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

'For linha = 2 To 501
'    If Range("A" & linha).Value = Range("E1").Value Then
'        Range("E2").Value = Range("B" & linha).Value
'        Exit For
'    End If
'Next

<strong>Exit Sub</strong>
TratamentoErro:
        MsgBox “Deu erro ao tentar encontrar o valor “”” & Range (“el”).Value & “”””
End sub

Porque usar o Exit Sub ao invés do End Sub?

Existe uma diferença sutil, mas relevante entre eles, o Exit Sub sai do código enquanto o End Sub encerra a macro, se usássemos o End Sub nesta posição, antes do tratamento, toda a parte de tratamento ficaria de fora da macro mesmo quando o erro ocorresse.

Agora precisamos sinalizar para o VBA que tratamos o erro, para isso vamos usar o Resume, logo após o resume vamos criar um local para que o código retorne, neste caso vai se chamar -> ContinuaçãoErro

Vamos colocar o ContinuaçãoErro logo após o resume e logo acima do For que é o local para onde queremos que ele volte a rodar.

VBA
Sub vlookupVBA()

On Error GoTo TratamentoErro

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

<strong>ContinuacaoErro:</strong>

'For linha = 2 To 501
'    If Range("A" & linha).Value = Range("E1").Value Then
'        Range("E2").Value = Range("B" & linha).Value
'        Exit For
'    End If
'Next

Exit Sub

TratamentoErro:
MsgBox “Deu erro ao tentar encontrar o valor “”” & Range (“el”).Value & “”””
        Resume <strong>ContinuacaoErro</strong>
End sub

Detalhe importante:

E se aparecer outro erro no código, como vamos saber que é diferente deste e como será para verificar esse novo erro?

O primeiro passo aqui é identificar esse erro que já tratamos até agora pelo nome, vamos renomear o código:

VBA
Sub vlookupVBA()

On Error GoTo TratamentoErro<strong>Vlookup</strong>

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

ContinuacaoErro<strong>Vlookup</strong>:

'For linha = 2 To 501
'    If Range("A" & linha).Value = Range("E1").Value Then
'        Range("E2").Value = Range("B" & linha).Value
'        Exit For
'    End If
'Next

Exit Sub

TratamentoErro<strong>Vlookup:</strong>
MsgBox “Deu erro ao tentar encontrar o valor “”” & Range (“el”).Value & “”””
        Resume ContinuacaoErroVlookup
End sub

On Error GoTo 0

O segundo passo é acrescentar On Error GoTo 0 logo abaixo da linha de código que já tratamos.

Colocamos o On Error GoTo 0 para que o VBA volte a tratar os erros com o tratamento padrão.

Dessa forma, se o primeiro erro não ocorrer os demais que possam existir vão receber o tratamento padrão que consiste na caixa que dá a opção de averiguar o erro como fizemos no início.

Outro ponto importante é colocar o “ContinuacaoErroVlookup:” (local de retorno da macro após o tratamento do 1º erro), ou seja, logo acima do On Error GoTo 0, isso porque se o local de retorno da macro estiver abaixo da mudança para o tratamento padrão, podemos ao encontrar um erro cair em um loop infinito.

Caso isso aconteça vou deixar alguns atalhos para sair do loop:

  • Control + pause
  • Control + break
  • Esc

Código = Resultado

VBA
Sub vlookupVBA()

On Error GoTo TratamentoErroVlookup

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

ContinuacaoErroVlookup:

On Error GoTo 0

Range("E2").Value = WorksheetFunction.VLookup(Range("E1").Value, Range("A:B"), 2, 0)

'For linha = 2 To 501
'    If Range("A" & linha).Value = Range("E1").Value Then
'        Range("E2").Value = Range("B" & linha).Value
'        Exit For
'    End If

'Next

Exit Sub

TratamentoErroVlookup:
    MsgBox "Deu erro ao tentar encontrar o valor """ & Range("e1").Value & """"
    Resume ContinuacaoErroVlookup
End Sub

Finalizamos o nosso tratamento de erro! Faça o teste e observe que o código volta ao tratamento padrão ao encontrar um segundo erro na macro.

Perguntas frequentes

1. Qual a diferença entre Exit Sub e End Sub no tratamento de erro?

O Exit Sub interrompe a execução naquele ponto e sai da macro, enquanto o End Sub encerra o procedimento. Se você usar End Sub antes do rótulo de tratamento, todo o bloco de tratamento fica fora da macro e nunca é executado, mesmo quando o erro acontece.

2. Para que serve o Resume no VBA?

O Resume avisa ao VBA que o erro foi tratado e devolve a execução para um ponto definido do código. Na aula, o Resume aponta para o rótulo ContinuacaoErroVlookup, criado logo acima da parte que precisa continuar rodando. Sem ele, a macro encerraria assim que exibisse a mensagem de erro.

3. O que faz o comando On Error GoTo 0?

Ele devolve ao VBA o tratamento padrão de erros. Depois de tratar o erro específico, escreva On Error GoTo 0 para que qualquer falha seguinte volte a exibir a caixa com a opção Depurar. Isso evita que erros diferentes caiam no mesmo tratamento e mascarem o problema real.

4. Como mostrar na mensagem o valor que causou o erro?

Concatene o conteúdo da célula dentro da MsgBox com o operador &. No exemplo da aula: MsgBox "Deu erro ao tentar encontrar o valor """ & Range("E1").Value & """". Assim o usuário vê exatamente qual valor foi pesquisado e entende o motivo da falha, em vez de uma mensagem genérica.

Conclusão – GoTo no VBA

Nesta aula trouxe um exemplo prático passo a passo de como fazer um tratamento de erro usando o GoTo no VBA.

Agora você já sabe como identificar o erro, construir a estrutura, personalizar mensagem e muito mais!

Espero que tenham gostado! Abraço,

Hashtag Treinamentos

Para acessar outras publicações de VBA, clique aqui!


Quer aprender mais sobre VBA com um minicurso básico gratuito?