Notifications
Clear all

PROCV VIA VBA

9 Posts
2 Usuários
0 Reactions
1,606 Visualizações
(@denilsonsl)
Posts: 0
New Member
Topic starter
 

BOM DIA GALERA.

Em anexo segue uma planilha que estou elaborando, substituindo a formula procv, por um código VBA.

Mas quando começa a ficar com mais de 5 linhas começa a ficar lento a execução do código, de qual forma posso resolver essa questão?

Além do Application.ScreenUpdating = False/True, em relação ao tempo de execução em que posso melhorar o código para ter uma execução mais rápida?

Segue código

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False

Sheets("Pedidos").Select

'Define as Sheets
Set P1 = Sheets("Pedidos")
Set P2 = Sheets("Dados")

'Limite da busca
Frow1 = P1.Range("A65536").End(xlUp).Row
Frow2 = P2.Range("A65536").End(xlUp).Row

            
I = 2

    Do While (I <> Frow1 + 1)

            For J = 2 To Frow2

                If P1.Cells(I, 1).Value = P2.Cells(J, 1) Then
                   P1.Cells(I, 2).Value = P2.Cells(J, 2)
                   P1.Cells(I, 3) = P2.Cells(J, 3)
                   P1.Cells(I, 4) = P2.Cells(J, 5)
                   P1.Cells(I, 5) = P2.Cells(J, 6)
                                      
                   J = Frow2 + 1
        
                 End If
            Next J
    
        I = I + 1

    Loop

Application.ScreenUpdating = True

End Sub
 
Postado : 17/03/2016 8:07 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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
 
Postado : 17/03/2016 9:38 am
(@denilsonsl)
Posts: 0
New Member
Topic starter
 

Ficou perfeito, somente um detalhe que eliminou uma tabela "dinâmica" que tinha na planilha, como resolvo isso?

 
Postado : 17/03/2016 10:13 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vc não tinha mencionado nada de dinâmica...
Aonde ela estava? O ideal seria vc postar o arquivo com a dinâmica, preu ver o q houve... Este código atende a dúvida no arquivo q vc postou, q tb não tem dinâmica....

 
Postado : 17/03/2016 10:20 am
(@denilsonsl)
Posts: 0
New Member
Topic starter
 

me perdoe, é uma tabela somente e não dinamica, o arquivo anexado esta com a tabela, a onde o codigo sera executado...

 
Postado : 17/03/2016 10:22 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Poste novo modelo então, com a tabela intacta. Eu adapto pra que ela não desapareça.

 
Postado : 17/03/2016 10:26 am
(@denilsonsl)
Posts: 0
New Member
Topic starter
 

Segue o anexo...

 
Postado : 17/03/2016 10:35 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

use esse:

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(2, 1), .Cells(lTeste, cTeste)).Value
    End With
    With plDados
        lDados = .Cells(.Rows.Count, 1).End(xlUp).Row
        cDados = 6
        mtDados = .Range(.Cells(2, 1), .Cells(lDados, cDados)).Value
    End With
    
    For i = 2 To lTeste - 1

        For j = 2 To lDados - 1
        
            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
    Next i
    
    With plTeste
        .Range(.Cells(2, 1), .Cells(lTeste, cTeste)).Value = mtTeste
    End With

End Sub
 
Postado : 17/03/2016 11:42 am
(@denilsonsl)
Posts: 0
New Member
Topic starter
 

Fecho, deu certo, muito obrigado....

 
Postado : 17/03/2016 12:01 pm