none
Acelerar un proceso de busqueda en visual basic 2019 RRS feed

  • Pregunta


  • Hola, que tal.

    Estoy desarrollando una aplicacion en visual basic que abre un documento de excel y luego compara un dato ingresado en un textbox con los datos que haya en la columna B de dicho documento, hasta encontrar el que se introdujo.

    Dicho dato esta compuesto tanto de letras como de numeros, y varia en cantidad, ya sea de solo 8 caracteres o de 23), estoy usando un ciclo for para hacer la comparasion. Lo unico que hago es irme desplazando de fila e ir comparando con la instruccion  worksheet.Cells(contador, 2).value, siempre en la misma columna (en este caso la B), y voy haciendo la comparacion con la celda B1, luego con B2 y asi hasta llegar a la B32000 

    El problema esta en que manejo alrededor  de 30000 filas y cuando comparo con datos que estan hasta el final, el proceso es mas tardado. Quisiera ver si hay una manera de hacer que el proceso sea mas rapido o mejorar el codigo. Espero y me puedan ayudar saludos. Les anexo el codigo que uso para comparar.

    For contador As Int16 = 1 To 32000
                dato = worksheet.Cells(contador, 2).value

                If dato = textbox.Text Then
                    Modelo.Text = contador
                    Fam_Led.Text = worksheet.Cells(contador, 16).value
                    Base.Text = worksheet.Cells(contador, 17).value
                    Cantidad_Led.Text = worksheet.Cells(contador, 8).value
                    contador = 32001
                ElseIf contador = 32000 Then
                    MsgBox("Modelo no encontrado)
                End If

            Next

    martes, 29 de octubre de 2019 21:27

Todas las respuestas

  • La razón por la que tarda es que cada vez que accedes a una celda en el bucle se produce una llamada a través de COM/Interop desde tu programa al Excel y vuelta. Estas llamadas son lentas, por lo que si las repites 30000 veces el tiempo total es largo.

    Una primara opción es transferir de golpe toda la columna a un array, con una sola llamada COM/Interop, y después hacer la búsqueda sobre el array. Pequeño inconveniente: tendrás que averiguar cómo se hace lo de leer todo un rango de celdas a un array. Sé que se puede hacer, pero no recuerdo de memoria la sintaxis exacta para poderte poner un ejemplo.

    Otra opción es usar el driver de OleDb para Excel (JET Engine) y tratar la hoja de cálculo como una tabla de base de datos, lo que te permite hacer un "select...where...". Esto accede directamente al fichero sin usar COM/Interop, por lo que es bastante rápido. Inconveniente: solo hay JET Engine para 32 bits.

    Otra: Usar OpenXml (si el fichero es xslx y no xsl). Esto también es bastante rápido porque buscas localmente sobre el árbol de objetos de OpenXml, que se carga directamente desde el archivo. Inconveniente: la curva de aprendizaje es empinada.

    • Propuesto como respuesta Pablo Rubio martes, 29 de octubre de 2019 22:44
    martes, 29 de octubre de 2019 21:54
  • Deleted
    • Propuesto como respuesta Pablo Rubio martes, 29 de octubre de 2019 22:45
    martes, 29 de octubre de 2019 22:22
  • Disculpa por ya no responder. En mi caso la primera opción me sirvió y funcionó muy bien. Realmente gracias.

    Te agradecería si me pudieras proporcionar algún buen link o info sobre la última opción.OpenXml 

    sábado, 2 de noviembre de 2019 23:47
  • Esta es la documentación del OpenXml:

    https://docs.microsoft.com/en-us/office/open-xml/open-xml-sdk

    Verás que tiene un enlace que te lleva a los ejemplos en GitHub.

    Recomiendo comenzar por el "getting started" y a partir de ahí ir avanzando en la documentación siguiendo el menú de la izquierda:

    https://docs.microsoft.com/en-us/office/open-xml/getting-started?view=openxml-2.8.1

    La descarga del SDK está aquí:

    https://www.microsoft.com/en-gb/download/details.aspx?id=30425

    • Propuesto como respuesta Pablo Rubio lunes, 4 de noviembre de 2019 17:21
    domingo, 3 de noviembre de 2019 8:37