Jump to content
edu_hoyos

ANSWERED BUSCARV en excel rapido y lento en VBA

Recommended Posts

Buenos dias.

Tengo una duda que me corroe desde hace meses y no logro dar con la respuesta.

Usamos muchas veces BUSCARV. Hasta ahora como todo era por formulas iba bien , ahora muchos procesos los estamos programando y siempre que uso el buscarV mediante programacion tarda una barbaridad

Con este codigo ( x 3 ) sobre 24000 filas tarda unos 8 minutos en finalizar.

Haciendolo a mano ( es decir poniendo la formula tal cual , copiando y pegando valores etc etc ) no tardo ni 30 segundos
 

 With Worksheets("Inventario").Range("C2:C" & Fin)
    .Formula = "=IF(ISERROR(VLOOKUP(A2,Datos_Magento!$A$2:$C$" & Final & ",3,0)),""Libre"",VLOOKUP(A2,Datos_Magento!$A$2:$C$" & Final & ",3,0))"
    .Formula = .Value
    End With
    

 

Share this post


Link to post
Share on other sites

Hola @edu_hoyos

Podrías intentar con For:

Sub Buscar()
Dim i, Final, Buscando As Variant
Final = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
Buscando = "Valor o palabra buscada"

    For i = 1 To Final
        If Cells(i, 1).Value = Buscando Then 'Usas la columna en la que necesitas buscar
            'AQUÍ COLOCAS LO QUE DESEAS QUE PASE
        End If
    Next i
    
End Sub

 

Si no te sirve buscamos otra solución ;)

Share this post


Link to post
Share on other sites
Hace 18 horas, Luis paz dijo:

Hola @edu_hoyos

Podrías intentar con For:

Sub Buscar()
Dim i, Final, Buscando As Variant
Final = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
Buscando = "Valor o palabra buscada"

    For i = 1 To Final
        If Cells(i, 1).Value = Buscando Then 'Usas la columna en la que necesitas buscar
            'AQUÍ COLOCAS LO QUE DESEAS QUE PASE
        End If
    Next i
    
End Sub

 

Si no te sirve buscamos otra solución ;)

Ayer tire por algo similar y tardaba el doble. Me gustaba el for porque podia controlar mas datos y podia optimizarlo de forma que no hiciera filas que no necesitaba pero se disparo a 12 minutos para terminar los 25.000 productos.

Share this post


Link to post
Share on other sites
Hace 14 horas, Leopoldo Blancas dijo:

Hola,

 

Deberías de subir tu archivo, y de esa manera vemos que proceso tarda menos... Incluso menos de 10 segundos...

Saludos.

Hola Leopoldo. Si soy consciente de que seria lo optimo. Tendria que eliminar demasiadas partes del programa para subirlo ( no por mi programa que eso me da igual sino porque los datos que uso son empresariales como costes de productos... )  por eso me quede en preguntarlo como duda para saber si el proceso de VBA sobre buscarV era tecnicamente igual o no y si es normal que haciendolo manual tarde lo que yo tarde en escribir la formula. Practicamente Excel no tarda muchos segundos en resolverlo en cambio esa parte escrita como pongo tarde muchos minutos.  Tanto en paso a paso como ejecutando automaticamente.

Si la respuesta es que no , que deberia tardar lo mismo que es lo que no he logrado encontrar , ya lo monto de propio aislando la parte del programa y lo suba. Gracias por contestar!!!

Share this post


Link to post
Share on other sites
Hace 2 horas, edu_hoyos dijo:

Hola Leopoldo. Si soy consciente de que seria lo optimo. Tendria que eliminar demasiadas partes del programa para subirlo ( no por mi programa que eso me da igual sino porque los datos que uso son empresariales como costes de productos... )  por eso me quede en preguntarlo como duda para saber si el proceso de VBA sobre buscarV era tecnicamente igual o no y si es normal que haciendolo manual tarde lo que yo tarde en escribir la formula. Practicamente Excel no tarda muchos segundos en resolverlo en cambio esa parte escrita como pongo tarde muchos minutos.  Tanto en paso a paso como ejecutando automaticamente.

Si la respuesta es que no , que deberia tardar lo mismo que es lo que no he logrado encontrar , ya lo monto de propio aislando la parte del programa y lo suba. Gracias por contestar!!!

Puede subir uno con datos aleatorios, y mostrar que es lo que deseas conseguir... Porque yo entendí que necesitabas buscar un producto... Pero luego entendí que necesitas remplazar la formula buscarv porque se te alentó 

Share this post


Link to post
Share on other sites

Esto es lo que buscas?

Sub Buscar()
Dim Resultado, ValBuscado As Variant
Dim RangoBuscado As Range

    ValBuscado = Hoja2.Range("A1").value
    Set RangoBuscado = Hoja1.Range("A1:B500")
    Resultado = Application.VLookup(ValBuscado, RangoBuscado, 2, False)
    
    If IsError(Resultado) Then
        Exit Sub
    End If
    
End Sub

 

Share this post


Link to post
Share on other sites

Hola a todos

Algo de teoría:

- Es más rápido usar fórmulas "nativas" ingresadas directamente en las celdas que usarlas insertándolas a través de VBA

- Cuando se dice que es más rápido usar macros (VBA) en lugar de miles de fórmulas, quiere decir realizar los procesos a través de dichas macros, no que se inserten esas mismas fórmulas a través de ellas porque termina siendo más lento que el punto anterior (tal y como le sucede ahora a nuestro amigo)

- Las fórmulas, sean insertadas con macros o directamente, siempre son más lentas cuando usan rango "indeterminados" tipo "C2:C".  Es un "clásico" error hacer/usar eso.

- Es innecesario usar fórmulas en celdas en las cuales ya se tiene un resultado que no va a cambiar. En esos casos lo ideal es copiar y pegar como valores.

- Si se desea mejorar la velocidad/rendimiento con macros, usar el método VlookUp de la propiedad WorksheetFunction, no es lo más rápido en realidad. En todo caso es mejor usar FInd.

- Si consideran una alternativa el uso de bucles tipo For - Next, o For - Each, tampoco será tan rápido como usar ADO y SQL o Scripting.Dictionary, o mejor aún, Scripting.Dictionary con arrays. 

Saludos

Share this post


Link to post
Share on other sites

Hola a todos!

En raros casos y con otra función de VBA, invocar una función nativa de Excel, puede resultar exitosa

Tus puntos @avalencia siguen siendo muy atinados desde la prehistoria de Excel, como lo eres tu!:D

 

Saludos 

Share this post


Link to post
Share on other sites
En 4/12/2019 at 10:02 , Gerson Pineda dijo:

Hola a todos!

En raros casos y con otra función de VBA, invocar una función nativa de Excel, puede resultar exitosa

Tus puntos @avalencia siguen siendo muy atinados desde la prehistoria de Excel, como lo eres tu!:D

 

Saludos 

JAJAJAJJAJAJAJJA un día me la pagarás Pineda 😛

Share this post


Link to post
Share on other sites
En 4/12/2019 at 2:15 , edu_hoyos dijo:

Tendria que eliminar demasiadas partes del programa para subirlo ( no por mi programa que eso me da igual sino porque los datos que uso son empresariales como costes de productos... )  por eso me quede en preguntarlo como duda para saber si el proceso de VBA sobre buscarV era tecnicamente igual o no y si es normal que haciendolo manual tarde lo que yo tarde en escribir la formula. Practicamente Excel no tarda muchos segundos en resolverlo en cambio esa parte escrita como pongo tarde muchos minutos.  Tanto en paso a paso como ejecutando automaticamente.

Si la respuesta es que no , que deberia tardar lo mismo que es lo que no he logrado encontrar , ya lo monto de propio aislando la parte del programa y lo suba

Nadie te ha solicitado datos confidenciales, nada cuesta que los reemplaces por otros valores, pero si deseas ayuda adecuada, debes subir una muestra de tus datos con la estructura real, que manejas en el archivo original, es mas no necesitamos tu programa

¿Me explico?

 

Saludos 

Share this post


Link to post
Share on other sites
En 5/12/2019 at 22:32 , Gerson Pineda dijo:

Nadie te ha solicitado datos confidenciales, nada cuesta que los reemplaces por otros valores, pero si deseas ayuda adecuada, debes subir una muestra de tus datos con la estructura real, que manejas en el archivo original, es mas no necesitamos tu programa

¿Me explico?

 

Saludos 

SI Si , si lo entiendo perfectamente. Simplemente en este caso para que sea una estructura real y solida para que las pruebas fueran con sentido tendria que dejar muchos datos. De todos modos leyendo todo lo que me habeis escrito e llegado a una solucion que pasa de 12 minutos a menos de 30 segundos. Sigo copiando la formula de BuscarV en la primera fila y luego arrastro con VBA. Si a alguien le sirve me alegro.

Gracias a todos!

Share this post


Link to post
Share on other sites
En 4/12/2019 at 13:39 , avalencia dijo:

Hola a todos

Algo de teoría:

- Es más rápido usar fórmulas "nativas" ingresadas directamente en las celdas que usarlas insertándolas a través de VBA

- Cuando se dice que es más rápido usar macros (VBA) en lugar de miles de fórmulas, quiere decir realizar los procesos a través de dichas macros, no que se inserten esas mismas fórmulas a través de ellas porque termina siendo más lento que el punto anterior (tal y como le sucede ahora a nuestro amigo)

- Las fórmulas, sean insertadas con macros o directamente, siempre son más lentas cuando usan rango "indeterminados" tipo "C2:C".  Es un "clásico" error hacer/usar eso.

- Es innecesario usar fórmulas en celdas en las cuales ya se tiene un resultado que no va a cambiar. En esos casos lo ideal es copiar y pegar como valores.

- Si se desea mejorar la velocidad/rendimiento con macros, usar el método VlookUp de la propiedad WorksheetFunction, no es lo más rápido en realidad. En todo caso es mejor usar FInd.

- Si consideran una alternativa el uso de bucles tipo For - Next, o For - Each, tampoco será tan rápido como usar ADO y SQL o Scripting.Dictionary, o mejor aún, Scripting.Dictionary con arrays. 

Saludos

Gracias a tu respuesta he logrado dejarlo en segundos.

Ni conozco Scripting pero me lo apunto pero a veces algo de teoria es justo lo que buscaba. Mil Gracias!

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy