:)
Hola! Wilson (y Dante).
Efectivamente cuando deseas cargar datos en un List/ComboBox de más de 10 columnas... ¡El AddItem "se pone fastidioso"!
Tienes 3 formas de sobrellevar el tema. Imaginemos que tus datos están en el rango A1:L10. Entonces:
1º) Puedes utilizar la propiedad List. Por ejemplo:
Private Sub UserForm_Initialize()
Dim Anchos
'Defino los anchos de las 12 columnas:
Anchos = Array(20, 25, 30, 25, 20, 25, 30, 25, 20, 25, 30, 25)
With ListBox1
.ColumnCount = 1 + UBound(Anchos)
.ColumnWidths = Join(Anchos, ";")
.Width = 10 + Application.Sum(Anchos)
DoEvents
'Ancho del Userform (de ser necesario):
Me.Width = 10 + .Left + .Width
'Cargo el listBox:
.List = Sheets("Hoja1").Range("A1:L10").Value
End With
End Sub
Como habrás notado: ¡basta una sóla línea para cargar los datos en el ListBox!
2º) De un modo muy similar puedes utilizar la propiedad RowSource:
Private Sub UserForm_Initialize()
Dim Anchos
'Defino los anchos de las 12 columnas:
Anchos = Array(20, 25, 30, 25, 20, 25, 30, 25, 20, 25, 30, 25)
With ListBox1
.ColumnCount = 1 + UBound(Anchos)
.ColumnWidths = Join(Anchos, ";")
.Width = 10 + Application.Sum(Anchos)
DoEvents
'Ancho del Userform (de ser necesario):
Me.Width = 10 + .Left + .Width
'Cargo el listBox:
.RowSource = Sheets("Hoja1").Range("A1:L10").Address(external:=True)
End With
End Sub
3º) Y si -de todas maneras- quieres utilizar el método AddItem entonces debes utilizar un "truco" integrado por dos líneas adicionales. A saber:
Private Sub UserForm_Initialize()
Dim Anchos, C As Range, i As Integer
'Defino los anchos de las 12 columnas:
Anchos = Array(20, 25, 30, 25, 20, 25, 30, 25, 20, 25, 30, 25)
With ListBox1
.ColumnCount = 1 + UBound(Anchos)
.ColumnWidths = Join(Anchos, ";")
.Width = 10 + Application.Sum(Anchos)
DoEvents
'Ancho del Userform (de ser necesario):
Me.Width = 10 + .Left + .Width
'Este es el "truco" para superar el problema del Nº de columnas mayor a 10:
.List = Range("Z1").Resize(, .ColumnCount).Value
.RemoveItem 0
'Cargo el listBox "normalmente" mediante AddItem:
For Each C In Range("A1:A10")
.AddItem
For i = 1 To ListBox1.ColumnCount
.List(.ListCount - 1, i - 1) = C(, i)
Next
Next
End With
End Sub
La expresión:
Range("Z1").Resize(, .ColumnCount).Value
Sólo representa a un rango CUALQUIERA de 12 celdas horizontales.
Fíjate que "inmediatamente" esa info es eliminada del listbox mediante:
.RemoveItem 0
Tras esas dos líneas estás en codiciones de cargar "normalmente" tu info utilizando el AddItem.
Feliz 2018.
Saludos, Cacho R.
:)
.
Juraría que te vi esas macros hace algunos años en uno de tantos foros en los que nos "vemos"... ya ves que mi memoria sigue buena je je :p - Abraham Valencia