Que hago cuando no se ve las columnas en un lixtbox

Tengo un buscador con doce columnas pero al momento de filtrar la información no se ve la información de las dos ultimas

Respuesta
2

:)

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.

:)

.

1 respuesta más de otro experto

Respuesta
2

El método additem, solamente te permite 10 columnas.

Deberás cargar con la propiedad .Rowsouce

no tengo mucho conocimiento en colocar o modificar esa propiedad

Te envié un par de correos

Te anexo el código para filtrar y cargar con rowsource

Private Sub TextBox1_Change()
    Call Filtrar(TextBox1.Value, 2)
End Sub
Private Sub TextBox2_Change()
    Call Filtrar(TextBox2.Value, 3)
End Sub
Private Sub TextBox3_Change()
    'Call Filtrar(TextBox3.Value, 4) 'telefono
End Sub
Private Sub TextBox4_Change()
    'Call Filtrar(TextBox4.Value, 5) 'fecha
End Sub
Private Sub TextBox5_Change()
    Call Filtrar(TextBox5.Value, 7)
End Sub
Private Sub TextBox6_Change()
    Call Filtrar(TextBox6.Value, 8)
End Sub
Private Sub TextBox7_Change()
    Call Filtrar(TextBox7.Value, 12)
End Sub
'
Sub Filtrar(valor, col)
'Por.Dante Amor
    Set h1 = Sheets("RUTAS")
    Set h2 = Sheets("TEMP")
    '
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
    uf = h1.Range("A" & Rows.Count).End(xlUp).Row
    If Trim(valor) = "" Then
        Me.ListBox1.RowSource = h1.Name & "!A2:M" & uf
        Exit Sub
    End If
    '
    h2.Cells.Clear
    h1.Rows(1).Copy h2.Rows(1)
    h2.Range("N1") = h1.Cells(1, col)
    h2.Range("N2") = valor
    '
    h1.Range("A1:L" & uf).AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=h2.Range("N1:N2"), CopyToRange:=h2.Range("A1:L1"), Unique:=False
    u2 = h2.Range("A" & Rows.Count).End(xlUp).Row
    ListBox1.RowSource = h2.Name & "!A2:N" & u2
End Sub

Es necesario una hoja llamada "temp" para poner en la hoja "temp" el resultado del filtro y entonces cargar con rowsource la hoja temp en el listbox

Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas