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!
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.
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.
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!
Expert em conteúdos da Hashtag Treinamentos. Auxilia na criação de conteúdos de variados temas voltados para aqueles que acompanham nossos canais.