Para DANTE - ListBox con más de 10 columnas

Hola estimado Dante:

Tengo un formulario en el que esta un listbox pero necesito que el listbox tenga más de 10 columnas.

El código es este:

Private Sub btn_Agregar_Click()

'Configuramos el Listbox
Me.ListBox1.ColumnCount = 5
Me.ListBox1.ColumnWidths = "50 pt;200 pt;40 pt;50 pt;50 pt"
'Agreamos los Items
Me.ListBox1.AddItem Me.TextBox2.Text
Me.ListBox1.List(i, 1) = Me.TextBox3.Text
Me.ListBox1.List(i, 2) = Me.TextBox4.Text
Me.ListBox1.List(i, 3) = Me.TextBox5.Text
Me.ListBox1.List(i, 4) = Me.TextBox6.Text
i = i + 1

Cuando agrego más de 10 columnas me da error.

¿Cómo hago para tener más de 10 columnas en el listbox?

Gracias por tu ayuda

1 Respuesta

Respuesta
1

No puedes cargar más de 10 columnas con additem, para esos casos puedes cargar con la propiedad rowsource

Por ejemplo:

Me.ListBox1.RowSource = "A1:M1"

Explícame qué quieres agregar para adaptar el código.

necesito cargar los datos de texbox. tengo 15 textbox en el formulario.

escribo los datos en los textbox y con btn_agregar los cargo al listbox

gracias

Con esto agregas los 15 textbox del 2 al 16 en el listbox

Private Sub btn_Agregar_Click()
'Por.Dante Amor
    Dim datos(0, 16)
    c = 0
    For i = 2 To 16
        datos(0, c) = Controls("TextBox" & i)
        c = c + 1
    Next
    ListBox1.ColumnWidths = "50; 200; 40; 50 ;50; 50 ;50; 50 ;50; 50 ;50; 50 ;50; 50 ;50"
    ListBox1.ColumnCount = 15
    ListBox1.List = datos
End Sub

Pero no entiendo qué pretendes hacer, quieres agregar más registros?

¿En tu macro cuánto vale la variable i?

Si quieres agregar un registro y después otro registro, te recomiendo que pases los datos de los 15 textbox a una hoja. Luego si agregas otro registro lo agregues a la hoja al final del primer registros y cada vez que agregues el registro a la hoja cargues el listbox con rowsource.

Si tienes dudas, explícame con detalle qué quieres hacer o envíame tu archivo con ejemplos y me explicas paso a paso qué haces; y te adapto el código.

Gracias por tu pronta respuesta.

Te explico a detalle:

Primero este es el código completo que utilizo:

Dim i As Long
Private Sub btn_Agregar_Click()

'Configuramos el Listbox
Me.ListBox1.ColumnCount = 15
Me.ListBox1.ColumnWidths = "50 pt;200 pt;40 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
'Agreamos los Items
Me.ListBox1.AddItem Me.TextBox1.Text
Me.ListBox1.List(i, 1) = Me.TextBox2.Text
Me.ListBox1.List(i, 2) = Me.TextBox3.Text
Me.ListBox1.List(i, 3) = Me.TextBox4.Text
Me.ListBox1.List(i, 4) = Me.TextBox5.Text
Me.ListBox1.List(i, 5) = Me.TextBox6.Text
Me.ListBox1.List(i, 6) = Me.TextBox7.Text
Me.ListBox1.List(i, 7) = Me.TextBox8.Text
Me.ListBox1.List(i, 8) = Me.TextBox9.Text
i = i + 1


'Liampiamos los TextBox
Me.TextBox1 = Empty
Me.TextBox2 = Empty
Me.TextBox3 = Empty
Me.TextBox4 = Empty
Me.TextBox5 = Empty
Me.TextBox6 = Empty
Me.TextBox7 = Empty
Me.TextBox8 = Empty
Me.TextBox9 = Empty
Me.TextBox1.SetFocus

End Sub

Private Sub btn_Eliminar_Click()
On Error GoTo Errores

Me.ListBox1.RemoveItem (ListBox1.ListIndex) 'Eliminar el item
Me.ListBox1.ListIndex = -1 ' Eliminar la "barra de selección"
For i = 0 To Me.ListBox1.ListCount - 1 'Inspeccionar el índce de registros para determinar cual es el último
Next
Me.TextBox1.SetFocus
Exit Sub

Errores:
MsgBox "Debe seleccionar una Factura"
End Sub

Private Sub btn_Procesar_Click()
Dim Fila As Integer
Dim Final As Integer
'Buscamoos la última fila
Fila = 7
Do While Hoja16.Cells(Fila, 1) <> ""
Fila = Fila + 1
Loop
Final = Fila
'Agregamos el bloque de items
For i = 0 To Me.ListBox1.ListCount - 1
Hoja16.Cells(Final, 1) = Me.ListBox1.List(i, 0) 'Sucursal
Hoja16.Cells(Final, 2) = Me.ListBox1.List(i, 1) 'NIT
Hoja16.Cells(Final, 3) = Me.ListBox1.List(i, 2) 'Razon Social
Hoja16.Cells(Final, 4) = Me.ListBox1.List(i, 3) 'Número de Factura
Hoja16.Cells(Final, 5) = Me.ListBox1.List(i, 4) 'Número de Autorización
Hoja16.Cells(Final, 6) = Me.ListBox1.List(i, 5) 'Fecha
Hoja16.Cells(Final, 7) = Me.ListBox1.List(i, 6) 'Importe Total
Hoja16.Cells(Final, 8) = Me.ListBox1.List(i, 7) 'ICE
Hoja16.Cells(Final, 9) = Me.ListBox1.List(i, 8) 'Excento
Final = Final + 1
Next
ListBox1.Clear 'Limpiamos el listbox
i = 0 'Reiniciamos el índice de registros del listbox
TextBox1.SetFocus 'Enviamos el foco al control
End Sub

Paso a detallarte.

Tengo un formulario con 15 textbox, 3 commandbutton y el listbox.

La idea es ingresas datos en los textbox y dando click al botón btn_agregar se cargen los datos primero al listbox. Una ves echo esto se limpian los texbox para volver a ingresar datos y cargarlos al listbox sin borrar los datos anteriores. Una ves ingresados todos los datos dar click al botón btn_procesar y que se vacíen todos los datos a la hoja de excel, en este caso Hoja16.

El código anterior me funciona bien, pero, me limita a 10 columnas en el listbox.

Agradezco mucho tu ayuda

Si vas a cargar más de 10 datos no podrás hacerlo con additem, así es como funciona el listbox.

Además veo que tienes esta instrucción

Me. ListBox1. RemoveItem (ListBox1. ListIndex) 'Eliminar el item

Si cargas los datos con rowsource tampoco puedes usar RemoveItem.

Lamento decirte que prácticamente tienes que hacer todo tu código.

¿Quieres qué te ayude a hacer todo el código?

Gracias.

No esperaba tener que cambiar el todo el código. Agradezco mucho tu ayuda.

Por favor ayúdame a rehacer todo el código, te envió el archivo excel con el formulario.

https://mega.co.nz/#fm/gVg1EITa 

Gracias

Perdón me equivoque en el enlace. Este es el correcto

https://mega.co.nz/#!sBpxRRyK!Y3o9Pl05B4H71u6dpa2DICNmrTA_CrhekMq3e8p5qX4

Este es el código para cargar 11 textbox en tu listbox

Private Sub btn_Agregar_Click()
'Por.Dante Amor
    Set h1 = Sheets("tmp")
    If TextBox1 = "" Then
        MsgBox "Falta la sucursal"
        Exit Sub
    End If
    u = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
    For i = 1 To 11
        h1.Cells(u, i) = Me.Controls("TextBox" & i)
    Next
    ListBox1.RowSource = h1.Name & "!A2:K" & u
    For i = 1 To 11
       Me.Controls("TextBox" & i) = ""
    Next
End Sub

Para que funcione debes crear una hoja llamada "tmp" para que en esta hoja se almacene temporalmente los datos que se van a cargar en el listbox.


Con el siguiente código se pasan los datos del listbox a la hoja "LVT"

Private Sub btn_Procesar_Click()
'Por.Dante Amor
    Set h1 = Sheets("tmp")
    Set h2 = Sheets("LVT")
    n = ListBox1.ListCount
    If ListBox1.ListCount = 0 Then
        MsgBox "No hay registros a generar"
        Exit Sub
    End If
    u1 = h1.Range("A" & Rows.Count).End(xlUp).Row
    u2 = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    h1.Range("A2:K" & u1).Copy
    h2.Range("A" & u2).PasteSpecial Paste:=xlValues
    h1.Range("A2:K" & u1).Clear
    Application.CutCopyMode = False
End Sub

Pon el siguiente código en el evento Active del userform, para limpiar la hoja tmp

Private Sub UserForm_Activate()
'Por.Dante Amor
    Set h1 = Sheets("tmp")
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    If u < 2 Then u = 2
    h1.Range("A2:K" & u).ClearContents
End Sub

Te anexo el archivo para que veas cómo está el código y la hoja.

https://www.dropbox.com/s/1nvvuwbeoqt4urj/a%20dam.xlsm?dl=0 


Falta el código para borrar un registro del listbox, te recuerdo que no puedes utilizar removeitem.

Si quieres que te ayude con el código, valora esta respuesta y crea una nueva pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas