¿Por qué la macro no carga todas las columnas y filas de una consulta en un listbox?

Solicito amablemente su ayuda para resolver lo siguiente:

Modifique una macro para agregar más columnas al listbox y dejo de funcionar, mi hoja era de 10 columnas y mostraba todas las filas relacionadas con el criterio del filtro; ahora que mi hoja excel aumento a 34 columnas, le cambie el numero de columnas en el código, pero solo carga en el listbox las primeras10 y además solo muestra una fila.

Les comparto la macro modificada:

Private Sub ListBox1_Click()
'Dar formato al ListBox y traer datos de la hoja
For i = 1 To 34
    Me.Controls("Label" & i) = Cells(1, i).Value
Next i
With ListBox1
    .ColumnCount = 34
    .ColumnWidths = "60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt; 60 pt"

          End With
End Sub

'Mostrar resultado en ListBox
Private Sub CommandButton5_Click()
On Error GoTo Errores
If Me.txtFiltro1.Value = "" Then Exit Sub
Me.ListBox1.Clear
j = 1
FILAS = Range("a1").CurrentRegion.Rows.Count
For i = 2 To FILAS
    If LCase(Cells(i, j).Offset(0, 5).Value) Like "*" & LCase(Me.txtFiltro1.Value) & "*" Then
        Me.ListBox1.AddItem Cells(i, j)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = Cells(i, j).Offset(0, 4)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = Cells(i, j).Offset(0, 9)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 10) = Cells(i, j).Offset(0, 10)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 11) = Cells(i, j).Offset(0, 11)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 12) = Cells(i, j).Offset(0, 12)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 13) = Cells(i, j).Offset(0, 13)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 14) = Cells(i, j).Offset(0, 14)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 15) = Cells(i, j).Offset(0, 15)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 16) = Cells(i, j).Offset(0, 16)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 17) = Cells(i, j).Offset(0, 17)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 18) = Cells(i, j).Offset(0, 18)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 19) = Cells(i, j).Offset(0, 19)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 20) = Cells(i, j).Offset(0, 20)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 21) = Cells(i, j).Offset(0, 21)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 22) = Cells(i, j).Offset(0, 22)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 23) = Cells(i, j).Offset(0, 23)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 24) = Cells(i, j).Offset(0, 24)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 25) = Cells(i, j).Offset(0, 25)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 26) = Cells(i, j).Offset(0, 26)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 27) = Cells(i, j).Offset(0, 27)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 28) = Cells(i, j).Offset(0, 28)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 29) = Cells(i, j).Offset(0, 29)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 30) = Cells(i, j).Offset(0, 30)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 31) = Cells(i, j).Offset(0, 31)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 32) = Cells(i, j).Offset(0, 32)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 33) = Cells(i, j).Offset(0, 33)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 34) = Cells(i, j).Offset(0, 34)
              Else
                                End If
                       Next i
             Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation
End Sub

Quedo atento a sus comentarios y agradezco de antemano su valioso apoyo.

Que tengan una excelente tarde.

3 respuestas

Respuesta
1

El listbox por carga vía additem solo deja cargar 10 campos, la forma más rápida de cargar más de 10 campos es a través de una matriz, puedes usar un rowsource pero tendrás que cambiar el rango cada que añades o quites una columna o fila te recomiendo más carga vía matriz es más versátil, usa esta modificacion a tu macro, claro que tendras que borrar todas las lineas que digan additem de tu macro y quitar rowsource de las propiedades o mas bien en la propiedad rowsource del listbox dejarla en blanco.

Private Sub UserForm_Initialize()
Set datos = Range("a1").CurrentRegion
matriz = datos
With ListBox1
    .Clear
    .ColumnCount =datos.columns.count
    .List = matriz
    .ColumnWidths = "60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt; 60 pt"
End With
End Sub

Hola, James Bond,

¡Excelente!, gracias por la explicación, ahora comprendo la diferencia entre additem y rowsource, sin duda usar una matriz será de mayor utilidad ya que constantemente se eliminan y agregan columnas y esto ahorra el trabajo de modificar rangos cada vez que sea requerido.

He realizado los cambios y tema solucionado, ¡Muchas gracias!

¡Esplendida tarde!

Hola de nuevo James Bond.

Te comparto que el listbox carga todas las columnas y filas de mi hoja excel, pero ahora el detalle es que el filtro que tenía ya no funciona, me podrías auxiliar con este asunto, se requiere que en el form se pueda filtrar por medio de un combobox o varios (dependientes) cualquier columna para que solo me imprima los datos filtrados.

Esta es la macro que utilizaba para filtrar:

Private Sub Txtfiltro_Click()
If Me.txtFiltro1.Value = "" Then Exit Sub
Me.ListBox1.Clear
j = 1
Filas = Range("a1").CurrentRegion.Rows.Count
For i = 2 To Filas
    If LCase(Cells(i, j).Offset(0, 1).Value) Like "*" & LCase(Me.txtFiltro1.Value) & "*" Then
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = Cells(i, j).Offset(0, 4)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = Cells(i, j).Offset(0, 9)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 10) = Cells(i, j).Offset(0, 10)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 11) = Cells(i, j).Offset(0, 11)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 13) = Cells(i, j).Offset(0, 12)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 14) = Cells(i, j).Offset(0, 13)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 15) = Cells(i, j).Offset(0, 14)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 16) = Cells(i, j).Offset(0, 15)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 17) = Cells(i, j).Offset(0, 16)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 18) = Cells(i, j).Offset(0, 17)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 19) = Cells(i, j).Offset(0, 18)

 ´
    Else
    End If
Next i
Exit Sub
Errores:
MsgBox "No existe el dato buscado.", vbExclamation
End Sub

De antemano agradezco la atención y quedo atento a tus comentarios, saludos.

eso es porque insistes en usar los Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1), en tablas con mas de 10 columnas esto sigue siendo el problema que ya te explique, aqui se ocupa otro tipo de programacion para ello requieres que la macro filtre los datos a otra hoja y de hay los carge por medio de una matriz al listbox, para ello tienes que crear un boton de busqueda o por un evento textbox1_afterupdate en el cual la macro se activa despues de dar enter, desde mi punto de vista es mejor desde un boton, las instrucciones del modulo inicial a partir del with listbox las puedes borrar y aun asi la macro funcionaria, ojo debe tener al menos un end with sino te va a poner un error.

esta es la macro

Private Sub CommandButton1_Click()
Set h1 = Worksheets("hoja1")
Set h2 = Worksheets("hoja2")
Set datos = Range("datos")
h2.Cells.Clear
With datos
    r = .Rows.Count
n = 2
For i = 2 To r
    dato = UCase(.Cells(i, 1))
        If dato Like "*" & UCase(txtFiltro1) & "*" Then
            h1.Rows(i).Copy h2.Rows(n)
            n = n + 1
        End If
    Next i
    Set lista = h2.Range("a2").CurrentRegion
    matriz = lista
    With ListBox1
    .Clear
    .ColumnCount = lista.Columns.Count
    .List = matriz
    .ColumnWidths = "60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt; 60 pt"
    End With
End With
erase matriz
set datos=nothing
End Sub
Private Sub UserForm_Initialize()
Set h1 = Worksheets("hoja1")
Set datos = h1.Range("a1").CurrentRegion
datos.Name = "datos"
matriz = datos
With ListBox1
    With ListBox1
    .Clear
    .ColumnCount = datos.Columns.Count
    .List = matriz
    .ColumnWidths = "60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt; 60 pt"
End With
End With
End Sub

Buenas tardes James Bond, muchas gracias por las observaciones y sugerencias, he llevado a cabo las indicaciones, pero a la hora de agregar un dato al textbox para realizar la búsqueda por medio del botón, me manda un error que dice: "No se puede configurar la propiedad list. Índice de matriz de propiedades no valido" y me ilumina la línea donde se encuentra  el código .list=matriz de la macro para la busqueda.

Soy principiante en este tema y no sé qué estoy haciendo mal, si lo considera necesario podría enviarle mi archivo para que me hiciera el favor de revisarlo, de antemano le agradezco mucho por su tiempo y atención, le deseo una tarde excelente.

Saludos.

Sube tu archivo a googledrive, mediafire o aun servicio de nube y pega el link aquí.

Hola James Bond, aquí lo solicitado, muchas gracias por la atención, excelente tarde, saludos.
 https://1drv.ms/x/s!AqvEuAxDisTUgRIThe-iFZTBmTxP 

Borra todo lo que tengas en el formulario buscar y pega este código, no funciona el anterior por varias razones no existe nada en la hoja1 todo esta en la hoja datos, la tabla la tienes como un tabla insertada llamada tabla15 y eso no estaba contemplada en la macro inicial, intente que apareciera los números en el listbox conforme los fuera tecleando pero como dije las limitaciones que mencione por medio de additem y listbox. Listcount no lo permiten los 34 campos, ahora funciona así en cuanto teecles el numero y des enter en el listbox en automático se cargara la información en el listbox1

Private Sub txtFiltro1_AfterUpdate()
Dim FUNCION As WorksheetFunction
Set FUNCION = WorksheetFunction
Set DATOS = Range("TABLA15")
CODIGO = Val(txtFiltro1.Text)
With DATOS
    CUENTA = FUNCION.CountIf(.Columns(1), CODIGO)
    If CUENTA = 0 Then MsgBox (CODIGO & " NO EXISTE "), vbCritical, "AVISO EXCEL"
    FILA = FUNCION.Match(CODIGO, .Columns(1), 0)
    MATRIZ = .Rows(FILA).Resize(CUENTA)
   With ListBox1
        .Clear
        .ColumnCount = DATOS.Columns.Count
        .List = MATRIZ
        .ColumnWidths = "60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt;20 pt;100 pt;180 pt;180 pt;200 pt;120 pt;100 pt;60 pt;60 pt;60 pt; 60 pt"
    End With
End With
Erase MATRIZ
Set DATOS = Nothing
End Sub

Buenos días James Bond, muchas gracias por las observaciones, por el tiempo y la atención brindada, funciona muy bien y me será de mucha utilidad para hacer otros formularios.

Que tengas un excelente inicio de semana y un esplendido día.

Saludos cordiales.

¡Gracias! 

Respuesta
1

Hola Dante amor

Muchas gracias por la explicación y los ejemplos, ahora comprendo la diferencia entre additem y rowsource.

¡Que tengas una excelente tarde!

¡Saludos!

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas