Notifications
Clear all

VlookUP + On Error GoTo

8 Posts
5 Usuários
0 Reactions
3,938 Visualizações
leandroxtr
(@leandroxtr)
Posts: 447
Reputable Member
Topic starter
 

Bom dia, pessoal.
Estou agarrado com uma demanda aqui e gostaria de saber se podem me ajudar.
Em resumo, estou tentando utilizar o tratamento de erro “On Error GoTo” duas vezes na mesma rotina. Vejam:

Composição do documento:
Na planilha, tenho duas folhas. Uma folha/aba com as informações da Matriz, que é um banco de dados padrão utilizado que serve de molde. A outra folha/aba é o banco a ser configurado de acordo com a matriz.

Funções usadas:
Para fazer isso, estou utilizando, em VBA, as funções “VlookUP” e “On Error GoTo”. Uma para puxar as informações e outra para fazer os tratamentos de erro que retornam, caso não atenda as condições.

A rotina:
A rotina faz a busca de duas formas. Primeiro é o Procv/Vlookup pela descrição, e caso não tenha a descrição ou ela seja diferente da Matriz, faz a busca pelo código. Porém, em uma terceira ocasião, o produto pesquisado pode não existir na Matriz, o que retornará os valores “N/E” [Não Existe], na correspondência dos itens.

Problema:
Acontece que a rotina está retornando erro no tratamento dos erros. Será que poderiam me ajudar?? Tentei ser o mais claro possível, mas fiquem a vontade para perguntar algo, se necessário.

Muito Obrigado!

Se te ajudou, não se esqueça de dar um like na resposta e marcar o tópico como finalizado.

Abraços!
Leandro Cordeiro

 
Postado : 26/09/2018 8:31 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Colega Leandroxtr, mude:

On Error Goto Depuração1
On Error Goto Depuração2

Para:

On Error Resume Next

Segue:

Option Explicit
Sub procv()
Dim wsheet_1, wsheet_2 As Worksheet
Dim CountLin_1, CountLin_2 As Long
Dim Procv_1, Procv_2, i As Double
Dim rng_1, rng_2 As Range


Set wsheet_1 = Sheets("Matriz")
Set wsheet_2 = Sheets("Novo")
CountLin_1 = wsheet_1.Range("a1048576").End(xlUp).Row
CountLin_2 = wsheet_2.Range("a1048576").End(xlUp).Row
Set rng_1 = wsheet_1.Range("A1:E" & CountLin_1)
Set rng_2 = wsheet_1.Range("B1:E" & CountLin_2)
Procv_1 = Empty
Procv_2 = Empty

wsheet_2.Select


For i = 2 To CountLin_2
On Error Resume Next
Cells(i, 4).Select
Procv_1 = Application.WorksheetFunction.VLookup(Cells(i, 2).Value, rng_2, 3, 0)
Procv_2 = Application.WorksheetFunction.VLookup(Cells(i, 2).Value, rng_2, 4, 0)

Depuração_1:


If Procv_1 = Empty Then
Procv_1 = WorksheetFunction.VLookup(Cells(i, 1).Value, rng_1, 4, 0)
Procv_2 = WorksheetFunction.VLookup(Cells(i, 1).Value, rng_1, 5, 0)
End If


Depuração_2:
If Procv_1 = Empty Then
Cells(i, 4).Value = "N/E"
Cells(i, 5).Value = "N/E"
Else
Cells(i, 4).Value = Procv_1
Cells(i, 5).Value = Procv_2
End If


Procv_1 = Empty
Procv_2 = Empty

Next i

End Sub

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 26/09/2018 9:00 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

leandroxtr,

Bom dia!

Minha sugestão.

Bem... eu não faria esse código com Vlookup. O VBA tem funções próprias mais eficiente para resolver isso com melhor performance final. Fiz da seguinte forma:
1 - Copiei a aba Novo para poder preservar seus dados originais que ficaram na aba chamada Novo(2).
2 - Quando digitar qualquer código na coluna A da aba Novo, o código vai buscar na aba Matriz o valor correspondente da coluna D e insere esse valor na coluna F. A mesma coisa você pode fazer para a descrição se quiser.

Veja se pode ser assim.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 26/09/2018 9:04 am
leandroxtr
(@leandroxtr)
Posts: 447
Reputable Member
Topic starter
 

Valeu demais pela contribuição, galera.

Então xlarruda, eu já tentei executar com esse tratamento de erro, mas o problema é que se der erro, o "resume next" pula todo o restante da rotina para o Next. E não seria isso que eu gostaria.

wagner, o meu caso é diferente, o processo que estarei executando não é manual/digitável. Estarei mandando uma rotina executar todo o processo de uma vez, e preciso que sejam avaliadas todas as 3 situações que coloquei.
Obs: as colunas em azul são apenas para minha conferência, os dados que devem ser preenchidos são os da coluna Custo Unitário e Saldo (buscando da planilha Matriz).

Obrigado aos dois.

Se te ajudou, não se esqueça de dar um like na resposta e marcar o tópico como finalizado.

Abraços!
Leandro Cordeiro

 
Postado : 27/09/2018 7:10 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Olá colega.

Bem, não necessariamente. Você pode tratar dessa forma:

Sub Código_Vlookup()

On Error Resume Next

For i = 2 To CountLin_2
código que faz o vlookup...
Next i

On Error GoTo TrataErro

Continuação do código....

Exit sub

TrataErro:
MsgBox "Erro: " & Err.Number & vbcrlf & "Descrição: " & err.Description
End Sub

Dessa forma, seu On Error resume next é cancelado assim que insere uma nova tratativa de erro. Ou seja, o Onerror Resume Next só irá forçar o Vlookup e nada mais.

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 27/09/2018 7:49 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Boa tarde, colega Leandro

Dá uma olhada na demanda do colega @Salezzi no tópico Vários tratamento de erros em um único código, bem semelhante à sua. Qualquer coisa dá um grito...

 
Postado : 27/09/2018 10:45 am
gfranco
(@wzxnet7)
Posts: 653
Honorable Member
 

Boa tarde.
Segue minha contribuição.
Deixei comentários nos módulos (sim eu criei mais um módulo).
Veja se te ajuda.

Resposta útil? Clique na mãozinha ao lado do botão Citar.

 
Postado : 27/09/2018 1:37 pm
leandroxtr
(@leandroxtr)
Posts: 447
Reputable Member
Topic starter
 

Valeu demais galerinha. Todos voccês que contribuíram de alguma forma.

A ajuda do wzxnet7 me atendeu perfeitamente. Valeu cara, me salvou aqui.

Abraço a todos!

Se te ajudou, não se esqueça de dar um like na resposta e marcar o tópico como finalizado.

Abraços!
Leandro Cordeiro

 
Postado : 28/09/2018 5:31 am