Não entendo nem imagino pq razão vc iria querer reescrever o PROCV via VBA. Mas não vou entrar neste mérito.
Eu traduzi seu código, usando a mesma lógica, mas ao invés de usar o Cells(), eu usei usando matrizes. Não é a melhor forma de fazer, mas num primeiro momento, vc vai ver o ganho absurdo de desempenho. O que quero dizer com isso, sim, é possível deixar ainda mais rápido. Mas pra seu objetivo de melhorar desempenho, essa melhora já atende e muito. Substitua seu código por esse.
Qualquer dúvida, me avisa!
Option Explicit
Sub Busca()
Dim plDados As Worksheet
Dim mtDados As Variant
Dim lDados As Long 'linhas
Dim cDados As Long 'colunas
Dim plTeste As Worksheet
Dim mtTeste As Variant
Dim lTeste As Long 'linhas
Dim cTeste As Long 'colunas
Dim i As Long
Dim j As Long
'Define as Sheets
Set plTeste = Sheets("Pedidos")
Set plDados = Sheets("Dados")
'Limite da busca
With plTeste
lTeste = .Cells(.Rows.Count, 1).End(xlUp).Row
cTeste = 5
mtTeste = .Range(.Cells(1, 1), .Cells(lTeste, cTeste)).Value
End With
With plDados
lDados = .Cells(.Rows.Count, 1).End(xlUp).Row
cDados = 6
mtDados = .Range(.Cells(1, 1), .Cells(lDados, cDados)).Value
End With
i = 2
Do While (i <> lTeste + 1)
For j = 2 To lDados
If mtTeste(i, 1) = mtDados(j, 1) Then
mtTeste(i, 2) = mtDados(j, 2)
mtTeste(i, 3) = mtDados(j, 3)
mtTeste(i, 4) = mtDados(j, 5)
j = lDados + 1
End If
Next j
i = i + 1
Loop
With plTeste
.Range(.Cells(1, 1), .Cells(lTeste, cTeste)).Value = mtTeste
End With
End Sub
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Postado : 17/03/2016 9:38 am