Função VLookup - er...
 
Notifications
Clear all

Função VLookup - erro 1004 - valor não encontrado

7 Posts
3 Usuários
0 Reactions
1,327 Visualizações
(@pedrocunha)
Posts: 4
New Member
Topic starter
 

Bom dia,

Estou tentando fazer um macro que substitua certo valor.
Ele vai procurar este valor em outra tabela e retornar o valor que correspondente à ele.
Para isto, tenho duas planilhas (Plan1 e Plan2).
Na Plan1 tenho uma lista com 2 colunas. Em uma coluna estão os valores que poderão ser inseridos, e na coluna do lado estão os valores para os quais os valores previamente inseridos serão corrigidos.
E na Plan2 tenho a planilha onde entrarei com os valores e eles serão corrigidos conforme a tabela na Plan1.
Seguem 2 imagens (Plan1 e Plan2, respectivamente) para explicar melhor estas planilhas.


Caso não tenha ficado claro: eu insiro um valor na coluna A da Plan2; este valor é procurado na coluna A da Plan2 e retornado o valor ao lado na Coluna B desta Plan2.
Ela funciona corretamente com valores que estejam configurados. Se é procurado algum valor e não encontrado nenhum, dá o seguinte erro:

Erro em tempo de execução ‘1004’:
Erro de definição de aplicativo ou de definição de objeto.

O código é o seguinte:

Public ILin As Long 'Variável de índice da qtde de valores

Public ILast As Long 'Variável que grava a qtde total de valores preenchidos
'Public ILast_final As Long 'Variável que grava a qtde total de valores ajustados preenchidos

Dim valor(1 To 4992) As String 'Variável que grava o valor

Function Conta_Linhas_Valor(area As Range) As Long 'Conta as linhas preenchidas em certa coluna
    Dim celula As Range, Total_Linhas_Diam As Long
    Total_Linhas_Diam = 0
    For Each celula In area
        If celula <> "" Then
            Total_Linhas_Valor = Total_Linhas_Valor + 1
        End If
    Next
    Conta_Linhas_Valor = Total_Linhas_Valor
End Function

Sub Substituir_valor() 'Substituir valores

ILast = Conta_Linhas_Valor(Worksheets("Plan2").Range("A8:A5000")) 'Conta as linhas preenchidas na coluna "Valor"
'ILast_final = Conta_Linhas_Valor(Worksheets("Plan2").Range("B8:B5000")) 'Conta as linhas preenchidas na coluna final Valor final

Set intervalo_ajuste = Worksheets("Plan1").Range("A1:B50") 'Invervalo para ajuste

For ILin = 1 To ILast
    'On Error Resume Next 'prossegue a leitura caso algum diâmetro esteja mal inserido
    valor(ILin) = Application.WorksheetFunction.VLookup(Cells(ILin + 7, "A").Value, intervalo_ajuste, 2, False)
    Worksheets("Plan2").Cells(ILin + 7, "B") = valor(ILin)
Next ILin

End Sub

Que forma de controle poderia ser feito para:

    * Não executar o macro quando não for encontrado algum valor.
    * Aparecer uma mensagem informando o erro. Se possível, informando em qual linha está o erro.[/list:u:3caa8r9y]

    E existe uma forma otimizar este meu código?

    Obrigado.

     
Postado : 03/05/2017 6:33 am
(@mprudencio)
Posts: 2749
Famed Member
 

Tenta assim

No inicio do codigo

on error resume next.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 03/05/2017 6:54 am
(@pedrocunha)
Posts: 4
New Member
Topic starter
 

MPrudencio

Eu até tentei este comando, mas ele pula para a próxima leitura.
Eu precisaria interromper o comando e fazer com que dê algum aviso de erro, se possível informando a linha que está dando este erro.
Na planilha que vou implantar este código, não poderei ter valores 'em branco'.

 
Postado : 03/05/2017 7:14 am
(@osvaldomp)
Posts: 858
Prominent Member
 

Experimente:

Sub ValorCorrigido()
 Dim v As Range, vc As Range
  For Each v In Sheets("Plan2").Range("A8:A" & Sheets("Plan2").Cells(Rows.Count, 1).End(3).Row)
   Set vc = Sheets("Plan1").Range("A2:A" & Sheets("Plan1").Cells(Rows.Count, 1).End(3).Row).Find(v.Value, lookat:=xlWhole)
    If Not vc Is Nothing Then v.Offset(, 1).Value = vc.Offset(, 1).Value Else: v.Offset(, 1).Value = "não encontrado"
  Next v
End Sub

Osvaldo

 
Postado : 03/05/2017 7:45 am
(@pedrocunha)
Posts: 4
New Member
Topic starter
 

Osvaldomp

Hmm, obrigado.
Código funcionou perfeitamente. Tenho uma dúvida sobre o código:
Ele 'armazena' o valor da célula?
Por exemplo, no código que postei o valor corrigido era salvo na variável índice "valor(ILin)".

 
Postado : 03/05/2017 8:51 am
(@osvaldomp)
Posts: 858
Prominent Member
 

Ele 'armazena' o valor da célula?

Se o valor da "Plan2" for encontrado na "Plan1" o comando abaixo replica direto em 'B' da "Plan2" o valor de 'B' da "Plan1", sem armazenar, sem variável.
v.Offset(, 1).Value = vc.Offset(, 1).Value

Osvaldo

 
Postado : 03/05/2017 9:01 am
(@pedrocunha)
Posts: 4
New Member
Topic starter
 

Ele 'armazena' o valor da célula?

Se o valor da "Plan2" for encontrado na "Plan1" o comando abaixo replica direto em 'B' da "Plan2" o valor de 'B' da "Plan1", sem armazenar, sem variável.
v.Offset(, 1).Value = vc.Offset(, 1).Value

Ok, obrigado pela ajuda Osvaldo.

Abraço.

 
Postado : 03/05/2017 10:18 am