Mostrar datos filtrados en listbox

Tengo el siguiente código que me permite filtrar los datos cargados a un listbox, esta parte funciona casi a la perfección, el detalle esta en que solo muestra 10 columnas y sin encabezado, se que VBA tiene esa limitación al usar el .AddItem, ¿pero existe alguna forma de poder vacilar dicha limitación?, dejo el código para que me puedan ayudar con las 02 inestabilidades que tiene mi proyecto, muchas gracias.

Private Sub ComboBox1_Change()
Application.ScreenUpdating = False
Dim fila, a As Integer
On Error Resume Next
ListBox1.Clear
a = 0
fila = 6
While Sheets("BDDatos").Cells(fila, 4) <> Empty
        dato = ComboBox1
    'Si el dato de la fila coincide con el combobox carga los registros al listbox
        Var = Sheets("BDDatos").Cells(fila, 4)
        If Var = dato Then
        a = ListBox1.ListCount
        ListBox1. AddItem
        ListBox1.List(a, 0) = Sheets("BDDatos"). Cells(fila, 1)
        ListBox1.List(a, 1) = Sheets("BDDatos"). Cells(fila, 2)
        ListBox1.List(a, 2) = Sheets("BDDatos"). Cells(fila, 3)
        ListBox1.List(a, 3) = Sheets("BDDatos"). Cells(fila, 4)
        ListBox1.List(a, 4) = Sheets("BDDatos"). Cells(fila, 5)
        ListBox1.List(a, 5) = Sheets("BDDatos"). Cells(fila, 6)
        ListBox1.List(a, 6) = Sheets("BDDatos"). Cells(fila, 7)
        ListBox1.List(a, 7) = Sheets("BDDatos"). Cells(fila, 8)
        ListBox1.List(a, 8) = Sheets("BDDatos"). Cells(fila, 9)
        ListBox1.List(a, 9) = Sheets("BDDatos"). Cells(fila, 10)
        ListBox1.List(a, 10) = Sheets("BDDatos"). Cells(fila, 11)
        ListBox1.List(a, 11) = Sheets("BDDatos"). Cells(fila, 12)
        ListBox1.List(a, 12) = Sheets("BDDatos"). Cells(fila, 13)
        ListBox1.List(a, 13) = Sheets("BDDatos"). Cells(fila, 14)
        ListBox1.List(a, 14) = Sheets("BDDatos"). Cells(fila, 15)
        ListBox1.List(a, 15) = Sheets("BDDatos"). Cells(fila, 16)
        ListBox1.List(a, 16) = Sheets("BDDatos"). Cells(fila, 17)
        ListBox1.List(a, 17) = Sheets("BDDatos"). Cells(fila, 18)
        ListBox1.List(a, 18) = Sheets("BDDatos"). Cells(fila, 19)
        ListBox1.List(a, 19) = Sheets("BDDatos"). Cells(fila, 20)
        ListBox1.List(a, 20) = Sheets("BDDatos"). Cells(fila, 21)
        ListBox1.List(a, 21) = Sheets("BDDatos"). Cells(fila, 22)
        ListBox1.List(a, 22) = Sheets("BDDatos"). Cells(fila, 23)
        ListBox1.List(a, 23) = Sheets("BDDatos"). Cells(fila, 24)
        ListBox1.List(a, 24) = Sheets("BDDatos"). Cells(fila, 24)
        ListBox1.List(a, 25) = Sheets("BDDatos"). Cells(fila, 26)
        ListBox1.List(a, 26) = Sheets("BDDatos"). Cells(fila, 27)
        ListBox1.List(a, 27) = Sheets("BDDatos"). Cells(fila, 28)
        ListBox1.List(a, 28) = Sheets("BDDatos"). Cells(fila, 29)
        ListBox1.List(a, 29) = Sheets("BDDatos"). Cells(fila, 30)
        ListBox1.List(a, 30) = Sheets("BDDatos"). Cells(fila, 31)
        ListBox1.List(a, 31) = Sheets("BDDatos"). Cells(fila, 32)
        ListBox1.List(a, 32) = Sheets("BDDatos"). Cells(fila, 33)
   End If 'Aumento la fila para que pase a la siguiente
fila = fila + 1
Wend
Application.ScreenUpdating = True
End Sub

Con esto cargo el combo, espero puedan ayudarme, gracias.

Private Sub UserForm_Initialize()
    With ListBox1
        .ColumnCount = 33
    End With
    For Each celda In Range("LISTAR")
        ComboBox1.AddItem celda.Value
    Next celda
End Sub

1 respuesta

Respuesta
2

H o   l a:

Para cargar más de 10 columnas y que el listbox tenga encabezado, la única forma es con RowSource.

Para utilizar el RowSource, en este caso que estás realizando un filtro, lo recomendable es pasar los datos que cumplen con la condición a otra hoja ("temp"), entonces cargas el contenido de la hoja "temp" al listbox. Te dejo el código:

Private Sub ComboBox1_Change()
'Act.Por.Dante Amor
    Set h1 = Sheets("BDDatos")
    Set h2 = Sheets("temp")         'hoja temporal
    enca = 5                        'fila de encabezados
    '
    h2.Cells.Clear
    h1.Rows(enca).Copy h2.Rows(1)
    Application.ScreenUpdating = False
    ListBox1.RowSource = ""
    j = 2
    For i = 6 To h1.Range("D" & Rows.Count).End(xlUp).Row
        If h1.Cells(i, "D") = ComboBox1.Value Then
            h1.Rows(i).Copy
            h2.Rows(j).PasteSpecial xlValues
            h2.Cells(j, 34) = i     'Almacena el número de fila
            j = j + 1
        End If
    Next
    u2 = h2.Range("D" & Rows.Count).End(xlUp).Row
    If u2 > 1 Then
        ListBox1.RowSource = h2.Name & "!A1:AH" & u2
    End If
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

Agregué al código algo importante.

H2. Cells(j, 34) = i 'Almacena el número de fila

En la hoja "temp" en la columna 34, estoy almacenando el número de fila correspondiente a la información de la hoja "BDDatos", es decir, si la fila 18 contiene el dato que es igual al combo, entonces en la hoja "temp" en la celda almacenaré un número 18.

Al momento de cargar con rowsource también cargaré lo de la columna "AH"; y cuando quiera saber el número de fila que estoy seleccionando en el listbox utilizo lo siguiente:

Private Sub ListBox1_Click()
'Por.Dante Amor
    fila = ListBox1.List(ListBox1.ListIndex, 33)
End Sub

Entonces al dar click en cualquier registro del listbox, automáticamente en la variable fila obtendré el número de fila de la hoja "BDDatos", y sabré que la información corresponde a esa fila.


Suena algo complicado, pero no hay otra forma de cargar más de 10 columnas y con encabezados. Pero ya tienes aquí la solución.


'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas