Código VBA para un Listbox con + de 10 columnas

Estoy trabajando con un UserForm el cual contiene un listBox en el que cargo una base de datos por medio un filtro. El problema que me presenta el listBox es que no me carga + de 10 columnas y necesito cargar un List Box con:

12 Columna, 14 Columna, 15 Columna, 17 Columna, 18 Columna y por ultimo de 24 Columna

Les agradezco su ayuda y asesoría para solucionar dicho error.

Anexo para el código para su revisión.

Código dentro de la UserForm

Private Sub UserForm_Activate()

Me.ListBox1.RowSource = "SC" 'Nombre de tabla
Me.ListBox1.ColumnCount = 12 'N° de columnas
Me.ListBox1.ColumnWidths = "20;60;20;20;20;20;20;20;20;20;20;20;20;20" 'Ancho de columnas

End Sub

Private Sub TextBox1_Change()

Codigo = Hoja6.Range("B" & Rows.Count).End(xlUp).Row
ListBox1 = Clear
ListBox1.RowSource = Clear

i = 0
For FILA = 2 To Codigo
Nombre = Hoja6.Cells(FILA, 2).Value
If UCase(Nombre) Like "*" & UCase(Me.TextBox1.Value) & "*" Then

Me.ListBox1.AddItem
Me.ListBox1.List(i, 0) = Hoja7.Cells(FILA, 1).Value
Me.ListBox1.List(i, 1) = Hoja7.Cells(FILA, 2).Value
Me.ListBox1.List(i, 2) = Hoja7.Cells(FILA, 3).Value
Me.ListBox1.List(i, 3) = Hoja7.Cells(FILA, 4).Value
Me.ListBox1.List(i, 4) = Hoja7.Cells(FILA, 5).Value
Me.ListBox1.List(i, 5) = Hoja7.Cells(FILA, 6).Value
Me.ListBox1.List(i, 6) = Hoja7.Cells(FILA, 7).Value
Me.ListBox1.List(i, 7) = Hoja7.Cells(FILA, 8).Value
Me.ListBox1.List(i, 8) = Hoja7.Cells(FILA, 9).Value
Me.ListBox1.List(i, 9) = Hoja7.Cells(FILA, 10).Value
Me.ListBox1.List(i, 10) = Hoja7.Cells(FILA, 11).Value
Me.ListBox1.List(i, 11) = Hoja7.Cells(FILA, 12).Value
i = i + 1
End If
Next

End Sub

Respuesta
3

. Ho la y bienvenido a TodoExpertos.

Sigue las instrucciones para agregar más de 10 columnas con el método AddItem

Primero se establece con la propiedad .List el número de columnas:

Private Sub UserForm_Activate()
  ReDim b(1 To 1, 1 To 20)  'número de columnas a agregar
  With ListBox1
    .ColumnCount = 20       'número de columnas a agregar
    .List = b               'se habilitan las columnas en el list
    .Clear                  'se limpia el list
  End With
End Sub

Y posteriormente puedes utilizarlo así:

Private Sub CommandButton1_Click()
  With ListBox1
    .AddItem Cells(1, 1)
    .List(.ListCount - 1, 1) = Cells(1, 2)
    .List(.ListCount - 1, 2) = Cells(1, 3)
    .List(.ListCount - 1, 3) = Cells(1, 4)
    .List(.ListCount - 1, 4) = Cells(1, 5)
    .List(.ListCount - 1, 5) = Cells(1, 6)
    .List(.ListCount - 1, 6) = Cells(1, 7)
    .List(.ListCount - 1, 7) = Cells(1, 8)
    .List(.ListCount - 1, 8) = Cells(1, 9)
    .List(.ListCount - 1, 9) = Cells(1, 10)
    .List(.ListCount - 1, 10) = Cells(1, 11)
    .List(.ListCount - 1, 11) = Cells(1, 12)
    .List(.ListCount - 1, 12) = Cells(1, 13)
    .List(.ListCount - 1, 13) = Cells(1, 14)
    .List(.ListCount - 1, 14) = Cells(1, 15)
    .List(.ListCount - 1, 15) = Cells(1, 16)
    .List(.ListCount - 1, 16) = Cells(1, 17)
    .List(.ListCount - 1, 17) = Cells(1, 18)
    .List(.ListCount - 1, 18) = Cells(1, 19)
    .List(.ListCount - 1, 19) = Cells(1, 20)
  End With
End Sub

---

Nota: Si utilizas la propiedad .List o el método .AddItem para cargar los datos, no utilices la propiedad .RowSource porque entran en conflicto.

---

. Al final de mi respuesta hay un botón para valorar.

Agradezco por responder lo antes posible, como podrá visualizar tengo los datos en la Hoja7 = Sheet("Hoja6") que se pueden visualizar en el ListBox1 al momento se ejecuta UserForm  ya listo lo que quiero es al momento de ejecutar el UserForm y comience a escribir en el TextBox1 me busque los datos de la tabla SC que está ubicado en la Sheet("Hoja6") y me muestre los datos buscados en la ListBox, pero ahí es donde da el error ya que solo se pueden agregar 10 columnas para visualizar los datos buscado y lo que se quiere es que me visualice todas las 12 columnas.

Por eso tengo entendido que el código AddItem solo me muestra 10 columnas, tengo uno que al momento de buscar si me visualiza las columna por que son 7 columnas .

El codigo acontinuación es el que use en de 7 columnas y me funciona.

Private Sub TextBox1_Change()

    Codigo = Hoja6.Range("B" & Rows.Count).End(xlUp).Row

    ListBox1 = Clear

    ListBox1.RowSource = Clear

    i = 0

    For FILA = 2 To Codigo

    Nombre = Hoja6.Cells(FILA, 2).Value   

    If UCase(Nombre) Like "*" & UCase(Me.TextBox1.Value) & "*" Then   

    Me.ListBox1.AddItem

    Me.ListBox1.List(i, 0) = Hoja6.Cells(FILA, 1).Value

    Me.ListBox1.List(i, 1) = Hoja6.Cells(FILA, 2).Value

    Me.ListBox1.List(i, 2) = Hoja6.Cells(FILA, 3).Value

    Me.ListBox1.List(i, 3) = Hoja6.Cells(FILA, 4).Value

    Me.ListBox1.List(i, 4) = Hoja6.Cells(FILA, 5).Value

    Me.ListBox1.List(i, 5) = Hoja6.Cells(FILA, 6).Value

    Me.ListBox1.List(i, 6) = Hoja6.Cells(FILA, 7).Value

    i = i + 1

    End If

    Next

End Sub

Pero quiero que me aparezcan más columna en este seria 12 columnas y tengo otras tablas con más columnas por eso necesito el código que me ayude con este problema.

Lee con atención mi respuesta.

Ahí explico lo que debes hacer para que funcionen más de 10 columnas con el método AddItem

Te muestro todo el código para utilizar AddItem con más de 10 columnas.

Lee con atención lo siguiente, aquí describo lo que hago con el código.

  • Debes cambiar todo tu código por el siguiente código.
  • Lo que hago es definir 2 variables globales al inicio de todo el código para almacenar la hoja y el contenido de toda la tabla en la variable 'a' en memoria, de esta manera las búsquedas son más rápidas.
  • Al cargar el listbox con la propiedad .List, se establece el número de columnas, en este caso se establecen 12.
  • Posteriormente cuando cambias el textbox, puedes cargar más de 10 columnas con el método AddItem.
  • Si observas bien mi código, no es necesario utilizar RowSource.

---

Option Explicit
'
Dim a As Variant
Dim sh As Worksheet
'
Private Sub TextBox1_Change()
  Dim i As Long, j As Long
  With ListBox1
    .Clear
    For i = 1 To UBound(a, 1)
      If UCase(a(i, 2)) Like "*" & UCase(TextBox1.Value) & "*" Then
        .AddItem                    'método AddItem
        .List(.ListCount - 1, 0) = a(i, 1)
        .List(.ListCount - 1, 1) = a(i, 2)
        .List(.ListCount - 1, 2) = a(i, 3)
        .List(.ListCount - 1, 3) = a(i, 4)
        .List(.ListCount - 1, 4) = a(i, 5)
        .List(.ListCount - 1, 5) = a(i, 6)
        .List(.ListCount - 1, 6) = a(i, 7)
        .List(.ListCount - 1, 7) = a(i, 8)
        .List(.ListCount - 1, 8) = a(i, 9)
        .List(.ListCount - 1, 9) = a(i, 10)
        .List(.ListCount - 1, 10) = a(i, 11)
        .List(.ListCount - 1, 11) = a(i, 12)
      End If
    Next
  End With
End Sub
'
Private Sub UserForm_Activate()
  Dim numcols As Long
  Dim tbl As ListObject
  '
  Set sh = Sheets("Hoja6")                    'O puedes poner Hoja7
  Set tbl = sh.ListObjects("SC")              'nombre de la tabla
  numcols = tbl.DataBodyRange.Columns.Count   'el número de columnas lo obtiene de la tabla
  a = tbl.DataBodyRange.Value
  With ListBox1
    .ColumnCount = numcols
    .ColumnWidths = "20;60;20;20;20;20;20;20;20;20;20;20"
    .List = a
  End With
End Sub

--------

Si las columnas son continuas, entonces puedes simplificar el AddItem de esta manera:

Private Sub TextBox1_Change()
  Dim i As Long, j As Long
  With ListBox1
    .Clear
    For i = 1 To UBound(a, 1)
      If UCase(a(i, 2)) Like "*" & UCase(TextBox1.Value) & "*" Then
        .AddItem                    'método AddItem
        For j = 1 To .ColumnCount   'desde la columna 1 hasta la 12 o las que tenga el listbox
          .List(.ListCount - 1, j - 1) = a(i, j)
        Next
      End If
    Next
  End With
End Sub

----

[No olvides valorar la respuesta.

.

---
Si gustas, en otra pregunta puedo mostrarte cómo cargar los datos en el listbox con la propiedad List, no necesitas ni AddItem ni Rowsorce.

Muchísimas gracias a funcionado a la perfección con los 2 códigos adjuntados.

Dante Amor 

Si gustas, en otra pregunta puedo mostrarte cómo cargar los datos en el listbox con la propiedad List, no necesitas ni AddItem ni Rowsorce.

Billy Anthony Solis Padilla 

Si se puede hacer eso estaría genial aprender los que sugieres podrías enseñarme es que creo que reduciría aún más el código y así poder hacerlo más simplificado y muchísimas gracias de antemano por resolver mi pregunta.

Tal vez no se reduzca más el código, pero será más rápido.

Crea una nueva pregunta y con gusto la respondo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas