Blog

Postado em em 17 de março de 2023

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!

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

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

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!”.

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:
        MsgBox “Deu erro!”
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:

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

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

Exit Sub
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.

Sub vlookupVBA()

On Error GoTo TratamentoErro

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

ContinuacaoErro:

'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 ContinuacaoErro
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:

Sub vlookupVBA()

On Error GoTo TratamentoErroVlookup

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

ContinuacaoErroVlookup:

'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 (“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

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.

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?

Quer ter acesso a um Minicurso de Finanças no Excel de forma 100% gratuita? Preencha seu e-mail abaixo!