PROGRAMAR EN VBA MACROS PARA EXCEL: Como Cargar o Llenar Listbox Excel con Mas de Diez Columnas

Como Cargar o Llenar Listbox Excel con Mas de Diez Columnas






Hoy presentamos un ejemplo solicitado por un suscriptor de nuestro canal de YouTube, el cual requerida saber Como Llenar un Listbox Con Mas de Diez Columnas, precisamente eso hace esta macro, rellena Listbox donde se requieren cargar en el Listbox más de 10 columnas.

Como es sabido los listbox de Excel solo admiten 10 columnas, pero tranquilos, existe la posibilidad de cargar más de diez columnas en el listbox, ya que muchas veces es preciso tener una cantidad mayor al límite del listbox de Excel.

Si te estás iniciando en la operación de Excel o requieres afirmar conocimientos, recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.

  

Suscribe a nuestro canal y activa la campanita para que YouTube te avise cuando se suba nuevo contenido al canal, en el vídeo encontrarás una explicación gráfica y detallada del ejemplo que se muestra en este post.







 


Al descargar el ejemplo y abrir el libro Excel se observa un botón que permite mostrar un formulario, en dicho formulario se puede filtrar por cliente o rango de fecha, pero eso no es motivo de este post, (si requieres saber como filtrar por cliente y fecha haz click en el link), lo interesante es que al filtrar se pueden cargar más de diez columnas al listbox.

Ya se ha explicado que para poder cargar más de 10 columnas en un listbox de Excel se necesita usar el método RowSource ya que el método AddItem, solo permite cargar en el listbox solamente hasta diez columnas, mientras que con RowSource se pueden rellenar un listbox con muchas más columnas, que las previstas con el método AddItem.

Cuando se inicia el formulario no hay problema, porque establecemos cual es el origen de los datos y se carga en el listbox, con el siguiente código

  .RowSource = "Hoja1!A1:" & wc & uf


⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Quizá sea de utilidad también

Como LLenar Combobox y Buscar Datos


Como enviar mail con archivo Excel y PDF mediante Outlook con Excel

Como rellenar un pagaré en forma automática Conectar Excel con Word

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛



⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛

Para proceder a cargar más de diez columnas en un listbox de Excel, vamos a apoyarnos en una hoja de Excel Temporal, es decir la vamos a insertar vamos a guardar los datos filtrados en ella, vamos a establecer el origen de los datos o RowSurce, cargando los resultados del filtro al listbox y por último elimina la hoja temporal, mostrándose en el listbox más de 10 columnas.

La macro en primer lugar va a eliminar una hoja cuyo nombre hemos dado con la macro, posterior a ello inserta una hoja de excel y se otorga el nombre predeterminado, creando luego un objeto con esta hoja, ello se hace con los siguientes códigos:

heets("DFSHJFDUYDAYRAIUY544TTTOMYDUTGD").Delete
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "DFSHJFDUYDAYRAIUY544TTTOMYDUTGD"
Set a = Sheets("DFSHJFDUYDAYRAIUY544TTTOMYDUTGD")

Luego se procede a realizar el filtro ya sea por cliente, por rango de fechas, una vez que la macro encontró cuales son los datos coincidentes con el criterio de búsqueda, en vez de cargados los datos filtrados en el listbox, ya que la base de datos tiene más de 10 columnas, procedemos a guardarlos temporalmente en la hoja de Excel que se ha creado a tal fin.

Para filtrar los datos ya sea por cliente o rango de fechas y guardar temporalmente en le hoja Excel se usa el siguiente fragmento de código


For i = 2 To uf
   strg = b.Cells(i, 3).Value
   dato0 = CDate(b.Cells(i, 4).Value)
   If UCase(strg) Like UCase(TextBox1.Value) & "*" And dato0 >= dato1 And dato0 <= dato2 Then
       a.Cells(fila, 1) = b.Cells(i, 1)
       a.Cells(fila, 2) = b.Cells(i, 2)
       a.Cells(fila, 3) = b.Cells(i, 3)
       a.Cells(fila, 4) = b.Cells(i, 4)
       a.Cells(fila, 5) = b.Cells(i, 5)
       a.Cells(fila, 6) = b.Cells(i, 6)
       a.Cells(fila, 7) = b.Cells(i, 7)
       a.Cells(fila, 8) = b.Cells(i, 8)
       a.Cells(fila, 9) = b.Cells(i, 9)
       a.Cells(fila, 10) = b.Cells(i, 10)
       a.Cells(fila, 11) = b.Cells(i, 11)
       a.Cells(fila, 12) = b.Cells(i, 12)
       fila = fila + 1

   End If
Next i


Una vez filtrados los datos y guardados en la hoja temporal se procede a modificar mediante código las propiedades del listbox, en este caso se le otorga una cantidad de 12 columnas, como así también el ancho de cada columna, por último y los más importante se establece el origen de datos o RowSource, de la siguiente manera:

With Me.ListBox1
    .ColumnCount = 12
    .ColumnWidths = "20 pt; 15pt; 170 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
    .RowSource = "DFSHJFDUYDAYRAIUY544TTTOMYDUTGD!A1:" & wc & uf
End With


Para finalizar la macro se elimina la hoja, luego de haber cargado los datos en el listbbox de Excel, todo lo mencionado sucede en forma casi instantánea, para evitar movimientos de pantalla se debe usar el siguiente código:

Application.ScreenUpdating = False


En el vídeo encontrarás un tutorial con una explicación más detallada, por lo que sugiero ver el tutorial denominado Como Rellenar Listbox de Excel con más de 10 Columnas, seguidamente se muestra el código completo y en forma posterior están los link de descargas.


Código que se inserta en un Formulario de Excel

'**************https://programarexcel.com  **** https://youtube.com/programarexcel*********



Private Sub CommandButton1_Click()
Unload Me
End Sub

Private Sub CommandButton2_Click()
On Error Resume Next
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
dato1 = CDate(TextBox2)
dato2 = CDate(TextBox3)
If dato2 = Empty Or dato1 = emtpy Then
MsgBox ("Debe ingresar datos para consulta entre rango de fechas"), vbCritical, "AVISO"
Exit Sub
End If
If dato2 < dato1 Then
MsgBox ("La fecha final no puede ser mayor a la fecha inicial"), vbCritical, "AVISO"
Exit Sub
End If

b.AutoFilterMode = False
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear

'Elimina hoja y crea hoja dando el mismo nombre que la eliminada
Sheets("DFSHJFDUYDAYRAIUY544TTTOMYDUTGD").Delete
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "DFSHJFDUYDAYRAIUY544TTTOMYDUTGD"
Set a = Sheets("DFSHJFDUYDAYRAIUY544TTTOMYDUTGD")
b.Range("A1:L1").Copy Destination:=a.Range("A1")
fila = 2

If dato2 < dato1 Then
MsgBox ("La fecha final no puede ser mayor a la fecha inicial"), vbCritical, "AVISO"
Exit Sub
End If

For i = 2 To uf
   strg = b.Cells(i, 3).Value
   dato0 = CDate(b.Cells(i, 4).Value)
   If UCase(strg) Like UCase(TextBox1.Value) & "*" And dato0 >= dato1 And dato0 <= dato2 Then
       a.Cells(fila, 1) = b.Cells(i, 1)
       a.Cells(fila, 2) = b.Cells(i, 2)
       a.Cells(fila, 3) = b.Cells(i, 3)
       a.Cells(fila, 4) = b.Cells(i, 4)
       a.Cells(fila, 5) = b.Cells(i, 5)
       a.Cells(fila, 6) = b.Cells(i, 6)
       a.Cells(fila, 7) = b.Cells(i, 7)
       a.Cells(fila, 8) = b.Cells(i, 8)
       a.Cells(fila, 9) = b.Cells(i, 9)
       a.Cells(fila, 10) = b.Cells(i, 10)
       a.Cells(fila, 11) = b.Cells(i, 11)
       a.Cells(fila, 12) = b.Cells(i, 12)
       fila = fila + 1

   End If
Next i


a.Range("D:G").NumberFormat = "dd/mm/yyyy"

uf = a.Range("A" & Rows.Count).End(xlUp).Row
uc = a.Cells(1, Columns.Count).End(xlToLeft).Address
wc = Mid(uc, InStr(uc, "$") + 1, InStr(2, uc, "$") - 2)
With Me.ListBox1
    .ColumnCount = 12
    .ColumnWidths = "20 pt; 15pt; 170 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
    .RowSource = "DFSHJFDUYDAYRAIUY544TTTOMYDUTGD!A1:" & wc & uf
End With

a.Delete
End Sub

Private Sub CommandButton3_Click()
Unload UserForm1
End Sub

Private Sub TextBox1_Change()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
On Error Resume Next
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
If Trim(TextBox1.Value) = "" Then
   Me.ListBox1.RowSource = "Hoja1!A1:L" & uf
   Me.ListBox1.ColumnCount = 12
   Me.ListBox1.ColumnWidths = "20 pt; 15pt; 170 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
   Exit Sub
End If


b.AutoFilterMode = False
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear
dato1 = CDate(TextBox2)
dato2 = CDate(TextBox3)

'Elimina hoja y crea hoja dando el mismo nombre que la eliminada
Sheets("DFSHJFDUYDAYRAIUY544TTTOMYDUTGD").Delete
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "DFSHJFDUYDAYRAIUY544TTTOMYDUTGD"
Set a = Sheets("DFSHJFDUYDAYRAIUY544TTTOMYDUTGD")
b.Range("A1:L1").Copy Destination:=a.Range("A1")
fila = 2
For i = 2 To uf
   strg = b.Cells(i, 3).Value
   If UCase(strg) Like UCase(TextBox1.Value) & "*" Then
       a.Cells(fila, 1) = b.Cells(i, 1)
       a.Cells(fila, 2) = b.Cells(i, 2)
       a.Cells(fila, 3) = b.Cells(i, 3)
       a.Cells(fila, 4) = b.Cells(i, 4)
       a.Cells(fila, 5) = b.Cells(i, 5)
       a.Cells(fila, 6) = b.Cells(i, 6)
       a.Cells(fila, 7) = b.Cells(i, 7)
       a.Cells(fila, 8) = b.Cells(i, 8)
       a.Cells(fila, 9) = b.Cells(i, 9)
       a.Cells(fila, 10) = b.Cells(i, 10)
       a.Cells(fila, 11) = b.Cells(i, 11)
       a.Cells(fila, 12) = b.Cells(i, 12)
       fila = fila + 1
   End If
Next i


a.Range("D:G").NumberFormat = "dd/mm/yyyy"

uf = a.Range("A" & Rows.Count).End(xlUp).Row
uc = a.Cells(1, Columns.Count).End(xlToLeft).Address
wc = Mid(uc, InStr(uc, "$") + 1, InStr(2, uc, "$") - 2)
With Me.ListBox1
    .ColumnCount = 12
    .ColumnWidths = "20 pt; 15pt; 170 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
    .RowSource = "DFSHJFDUYDAYRAIUY544TTTOMYDUTGD!A1:" & wc & uf
End With

a.Delete
End Sub

Private Sub TextBox2_Change()
If Len(UserForm1.TextBox2) = 10 Then UserForm1.TextBox3.SetFocus
End Sub

Private Sub TextBox3_Change()
If Len(UserForm1.TextBox3) = 10 Then UserForm1.CommandButton2.SetFocus
End Sub

Private Sub UserForm_Initialize()
Dim fila As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
uc = b.Cells(1, Columns.Count).End(xlToLeft).Address
wc = Mid(uc, InStr(uc, "$") + 1, InStr(2, uc, "$") - 2)
With Me.ListBox1
    .ColumnCount = 12
    .ColumnWidths = "20 pt; 15pt; 170 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
    .RowSource = "Hoja1!A1:" & wc & uf
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
On Error GoTo Fin
If CloseMode <> 1 Then Cancel = True
Fin:
End Sub


Código que se inserta en un módulo

'**************https://programarexcel.com  **** https://youtube.com/programarexcel*********

Sub muestra1()
UserForm1.Show
End Sub

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends