Como agilizar la carga de datos en listbox (15,000 datos)

Tengo una base de datos de aproximadamente 15,000 datos registrados

El cual con ayuda de un código.. Que a continuación anexo

Private Sub TextBox1_Change()
Application.ScreenUpdating = False
TextBox1.Value = UCase(TextBox1) 'cambiar # de textbox
Set b = Sheets("BASE_ENTRADA")
uf = b.Range("A" & Rows.Count).End(xlUp).Row 'LA COLUMNA A ES EL FOLIO
Me.ListBox1.RowSource = ""
With ListBox1
   .ColumnCount = 17 ' NUMERO DE COLUMNAS
   .List = Range("B1:S1").Value ' ENCABEZADOS DEL RANGO
   .ColumnWidths = "50 pt;90 pt;110 pt;70 pt;70 pt;100 pt;70 pt;70 pt;70 pt;70 pt;70 pt;90 pt;100 pt;1 pt;110 pt;70 pt;70 pt;60 pt"    'asignando ancho de columnas
   .Clear
   For i = 2 To b.Range("B1").End(xlDown).Row 'FILA DE ENCABEZADOS cliente
   '
     strg = b.Cells(i, 1).Value 'cambiar # de columna a buscar EN ESTE CASO EL 1 ES EL NOMBRE
    If UCase(strg) Like "*" & UCase(TextBox1.Value) & "*" Then 'cambiar # de textbox
        . AddItem
        . List(.ListCount - 1, 0) = b. Cells(i, 1) ' FOLIO
        . List(.ListCount - 1, 1) = b. Cells(i, 2) ' FECHA
        . List(.ListCount - 1, 2) = b. Cells(i, 3) ' EMISOR
        . List(.ListCount - 1, 3) = b. Cells(i, 4) ' CONCEPTO1
        . List(.ListCount - 1, 4) = b. Cells(i, 5) ' CLAVE
        . List(.ListCount - 1, 5) = b. Cells(i, 6) ' PRODUCTO
        . List(.ListCount - 1, 6) = b. Cells(i, 7) ' CANTIDAD
        .List(.ListCount - 1, 7) = Format(b.Cells(i, 8), "$#,##0.00") ' P/U
        .List(.ListCount - 1, 8) = Format(b.Cells(i, 9), "$#,##0.00") ' IMPORTE
        . List(.ListCount - 1, 9) = b. Cells(i, 10) ' RECEPTOR
        . List(.ListCount - 1, 10) = b. Cells(i, 11) ' CONCEPTO2
        . List(.ListCount - 1, 11) = b. Cells(i, 12) ' USUARIO
        . List(.ListCount - 1, 12) = b. Cells(i, 13) ' TIPO DE MOVIMIENTO
        . List(.ListCount - 1, 13) = b. Cells(i, 14) '
        . List(.ListCount - 1, 14) = b. Cells(i, 15) ' OBSERVACIONES
        . List(.ListCount - 1, 15) = b. Cells(i, 16) ' FOLIO O REPARTIDOR
        . List(.ListCount - 1, 16) = b. Cells(i, 17) ' VENDEDOR O ENCARGADO
        . List(.ListCount - 1, 17) = b. Cells(i, 18) ' UNIDAD DE MEDIDA
    End If
    Next i
End With
If ListBox1.ListCount > 0 Then
TextBox2.Value = Empty
TextBox3.Value = Empty
TextBox4.Value = Empty
TextBox5.Value = Empty
Else
MsgBox "Si No Se Encuentra El FOLIO " & TextBox1.Value & " Puede Ser Por: 1.- No Hay Datos Registrados " & vbCr & " O 2.- La Busqueda Es Incorrecta. Intenta de Nuevo", vbExclamation, "INFORMACIÓN UTIL"
''TextBox1.Value = Empty
End If
Me.ListBox1.ColumnWidths = "50 pt;90 pt;110 pt;70 pt;70 pt;100 pt;70 pt;70 pt;70 pt;70 pt;70 pt;90 pt;100 pt;1 pt;110 pt;70 pt;70 pt;60 pt"
End Sub

coloco una letra en el textbox 1 y me busca por medio de comodin.. Todos lo datos que existan y tenga esa letra... Entre mas letras coloque y haya concidencia se va filtrando...

hasta aqui todo excelente...

El detalle que al borrar el dato colocado en textbox1... Este cargara todos los 15,000 datos en la lista...

El cual no estaría del todo mal

Pero tarda mucho + demasiado en cargar los datos...

¿Me pueden apoyar en mejor el código o donde estoy fallando?

Tarda un poco al buscar el dato con el comodín.. Pero al borrar el dato del textbox1 tarda mucho más porque carga los 15,000 datos y eso que la base seguirá creciendo...

2 Respuestas

Respuesta
1
Respuesta
2

Y si pones una validación después de esta línea Me.ListBox1.RowSource = ""

If Textbox1 = "" then exit sub

Hola dan buenas noches 

Si me funcionó.. Ya que no evita la carga de todos los 15,000 datos... 

Disculpa el código es correcto? 

Es por la cantidad de datos que hay que de por si tarda o estoy haciendo algo mal? Pará que se pueda agilizar... Gracias dan saludo 

¿Qué versión de excel tienes?

¿En verdad puedes cargar más de 10 columnas al listbox con .AddItem?

La versión de mi excel es 2016

Y si, si carga más de 10 columnas solo que es muy lento

Quisiera ver otras opciones pero respetando lo que ya tengo

Me parece que poner al usuario en un listbox más de 1,000 registros no es una buena práctica.

Filtrar letra por letra es muy bonito cuando tienes pocos datos, te permite observar como va cambiando la consulta, pero con muchos registros, eso tampoco es una buena práctica.

Definitivamente un ciclo For en este tipo de consultas no es bueno.

Deberás buscar otra alternativa, buscar con .Find o filtrar con un Filtro avanzado.


Qué tienes en la columna A, ¿tienes folios duplicados o son folios únicos?

Puedes poner una muestra de lo que tienes en la columna A.

Si.. como dices al principio genial funcionaba rápido

Pero luego con el tiempo que se van agregando más datos se vuelve más lento..

Son folios repetidos ya que a veces una nota tiene 7 productos y pues agarra 7 veces el folio A0001 (por poner ejemplo)

Pero si tuviese solo 2 productos solo se repiten 2 veces

Así sucesivamente se va generando la base de datos...

Hasta lleva 15200 datos y contnuara... por eso ando viendo como modificarlo antes que me cierre excel por pensarlo mucho je je

Saludos

El folio, ¿siempre es una letra "A" y un consecutivo?

Siempre está ordenada la columna A por el folio, ¿de menor a mayor?

Si

Siempre es una letra A

y es de menor a mayor..

Con números consecutivos

¿En realidad quieres mostrar en el listbox todo lo que "aparentemente" es igual?

Es decir, si escribes "A1", quieres mostrar los folios desde el "A1000" hasta el "A1999"

¿Tiene caso?

¿Para qué te sirve mostrar 1,000 folios en la pantalla?

Como te comenté anteriormente, buscar un dato entre mil folios, no es nada práctico, estar haciendo scroll o pantalla por pantalla por cientos de datos no es nada elegante ni práctico.

Si ya tienes el número de folio, sería más fácil si lo escribes y presionas un botón para hacer la búsqueda y mostrar en el listbox todo los folios iguales.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas