Búsqueda lenta con "For i - Next" en VBA Excel

Tengo que buscar en una BD (excel) con casi 90.000 registros a empleados por el legajo.

Los legajos pueden estar repetidos. Necesito encontrar todos los registros de un mismo empleado y traerlos a otro archivo de excel.

El legajo tiene 7 dígitos. El primer dígito puede variar del 1 al 6, los otros seis identifican al

empleado (ej.: Juan Pérez tiene el legajo 123.123 y puede estar así 1123123, 2123123, 3123123, 4123123, 5123123 y 6123123.

Por lo tanto, escribí un código basándome en "for i - Next" y que busque de cada legajo las seis opciones (es decir, el código corre seis veces).

La búsqueda dura unos cinco minutos. Es posible hacerlo en menos tiempo??? Hay otra forma de buscar más rápida?

Cuando se encuentra el legajo trae los datos de esa fila, repito, puede estar repetido varias veces el legajo, por lo tanto, trae varias filas de la base de datos.

Agradezco si tienen sugerencias al respecto.

Atentamente, Carlos.

1 Respuesta

Respuesta
1

No se que códigos estés utilizando pero hay muchas manera de hacer lo mismo, creo que lo más importante es que utilices lo que conoces y a lo que conoces le vayas agregando cosas nuevas.

Para mejorar tu código puedes condicionar a una sola búsqueda, en lugar de realizar las 6 que haces ahora

1) EL dato buscado no se como lo determinas ya que veo un punto intermedio, pero para sacarlo y que sea comparable con los últimos 6 dígitos podrías usar estos códigos:

dato = Mid(Range("A1").Value, 1, 3) & Right(Range("A1").Value, 3)

En mi ejemplo 123.123 esta en la celda A1, y el resultado de "dato" es 123123

Ahora en la condición de tu búsqueda debes hacer algo similar, es decir, no buscar el valor completo de la celda si no solo sus últimos 6 dígitos, más o menos así:

Imagino tienes algún código así

if Range("A" & i).value = dato then

lo cambiarías por este

if Right(Range("A" & i).value,6) = dato then

Espero haber aclarado tus dudas y espero funcione y disminuya tus tiempos. Ya que realizaría una sola búsqueda, no 6

Ante todo, muchas gracias por responder (y rápidamente).

Estoy de acuerdo en lo que tú dices sobre mejorar mi código (ya que estoy en proceso de aprendizaje).

Probé lo que me ofreces y obtuve como resultado lo siguiente:

Solicité la búsqueda del Legajo 6123123 y en "dato" me devuelve 612123 (me quita el cuarto dígito).

Por otro lado, se detiene con error y dice: "Se ha producido un error 1004 en tiempo de ejecución... Error en el método Range de objeto _Global cuando corre la línea siguiente:

If Right(Range("A" & i).Value, 6) = dato Then

Esperaré tu respuesta...!!!

Luego de varias pruebas, pude lograr que el el código me devuelva el número

de Legajo sin el primer dígito:

dato = Mid(Range("A1").Value, 2, 6)

If Right(Range("A" & i).Value, 6) = dato Then

Pero, aún me falta resolver el error.

Esperaré si puedes comentarme cómo resolverlo.

Una vez más, muchas gracias!!!

Luego de realizar pruebas e intentos, modificando el código que gentilmente me ofreciste, logré lo que necesitaba.

Ahora la búsqueda se efectúa en  menos de un minuto (aceptable) de los casi cinco que tardaba antes.

Por esta razón, considero terminada esta consulta.

Muchas gracias por tu colaboración...!!!

Carlos.

Excelente, porque lo acotado del consejo es acertado y me obliga a investigar y redunda en favorecer mi aprendizaje. Ahora tengo una nueva herramienta para mis proyectos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas