Mantener títulos en un Listbox cambiando sus valores

Quería comentar un problema que me aparece en un Listbox para ver si me podían echar una mano. El Listbox estará acompañado de 1 TextBox y de 2 botones más en un formulario.

En el formulario lo que pretendo es que apretando a uno de los botones se cargue en el Listbox una tabla de una hoja y que con ella se ponga el titulo que aparece (mediante ColumnHeads) en el Listbox. A continuación, asignando una palabra en el TextBox y apretando después al otro botón, se seleccionen las filas donde se repite esa palabra y las muestre por el Listbox. Pero es aquí donde no se como conseguir que se muestren los títulos en el mismo Listbox. Hasta ahora solo había conseguido que aparecieran introduciendo en la posición primera del Listbox pero no como encuadrarlas mediante la propiedad ColumnHeads.

La subrutina que tengo hasta ahora es la siguiente:

Private Sub CommandButton1_Click()
Dim rngRango As Range
Set rngRango = Worksheets("Hoja1").Range("B4:E14")
Me.ListBox1.ColumnHeads = True
Me.ListBox1.ColumnCount = rngRango.Columns.Count
Me.ListBox1.RowSource = rngRango.Address(external:=True)
Set rngRango = Nothing
End Sub

Private Sub CommandButton2_Click()
Application.ScreenUpdating = False
valor = TextBox1
Sheets("Hoja1").Unprotect
Sheets("Hoja1").Activate
Cells.EntireRow.Hidden = False
uf = Range("B" & Cells.Rows.Count).End(xlUp).Row
If valor = "" Then Exit Sub

ListBox1.RowSource = "": ListBox1.ColumnCount = 4
Dim Datos(11, 3)

For fil = 0 To uf
For j = 0 To 3
If Range("B" & fil + 4) <> valor Then
Rows(fil + 4 & ":" & fil + 4).EntireRow.Hidden = True
Else
Datos(fil, j) = Cells(fil + 3, j + 2)
End If
Next j
Next fil
ListBox1.List() = Datos
For i = ListBox1.ListCount - 1 To 0 Step -1
On Error Resume Next
If ListBox1.List(i) <> TextBox1 Then
ListBox1.RemoveItem (i)
End If
Next i

Sheets("Hoja1"). Protect
Sheets("Hoja2"). Activate
End Sub

1 respuesta

Respuesta
2

Solamente puedes cargar títulos cuando cargas el listbox con la propiedad rowsource.

Cuando cargas el listbox con additem o con ListBox1.List() = Datos, no puedes utilizar columnshead

Si los títulos son fijos, puedes dejarlos fijos en el form con labels o carga el primer registro del listbox con la fila de títulos, por ejemplo

Si tus títulos están en la fila 3

Listbox1. Additem cells(3,"B")

ListBox1.List(ListBox1.ListCount - 1, 1) = cells(3,"C")

ListBox1.List(ListBox1.ListCount - 1, 2) = cells(3,"D")

ListBox1.List(ListBox1.ListCount - 1, 3) = cells(3,"E")

Saludos. Dam
Si es lo que necesitas.

Hola aprendemos,gracias por su respuesta tan rápida, pero intente ya introducir en la primera linea mis títulos como me ha dicho,aunque los introduje dentro de la matriz. La cuestión es que aunque se pongan en la primera fila si tengo la propiedad ColumnHeads activada se pone debajo de esta y los títulos del listbox quedan vacíos. Esta es la forma de como lo había puesto yo:

Application.ScreenUpdating = False
valor = TextBox1
Cells.EntireRow.Hidden = False
uf = Range("B" & Cells.Rows.Count).End(xlUp).Row
If valor = "" Then Exit Sub

ListBox1.RowSource = "": ListBox1.ColumnCount = 4: ListBox1.ColumnHeads = True

Dim Datos(11, 3)
Datos(0, 0) = Cells(3, "B") '"Nombre"
Datos(0, 1) = Cells(3, "C") '"Edad"
Datos(0, 2) = Cells(3, "D") '"Curso"
Datos(0, 3) = Cells(3, "E") '"Ciudad"
For fil = 1 To uf
For j = 0 To 3
If Range("B" & fil + 3) <> valor Then
Rows(fil + 3 & ":" & fil + 3).EntireRow.Hidden = True
Else
Datos(fil, j) = Cells(fil + 3, j + 2)
End If
Next j
Next fil


ListBox1.List() = Datos
For i = ListBox1.ListCount - 1 To 0 Step -1
On Error Resume Next
If ListBox1.List(i) <> TextBox1 And ListBox1.List(i) <> "Nombre" Then
ListBox1.RemoveItem (i)
End If
Next


Con respecto a introducir los títulos con labels, es que no puedo porque este es una prueba de solo 4 columnas y yo quería un listbox con 32 columnas y mediante las barras de desplazamiento ir viendo los datos para no tener un listbox que ocupe todo el formulario.

Ahora viendo que no se puede colocar mediante list los títulos,tal vez sería mejor hacer un filtro avanzado y copiar los datos en una hoja de excel y de hay cargarlos con rowsource? Espero su respuesta,

Un saludo

Una pregunta, se podría utilizar la propiedad ListFillRange? es que la he visto en este foro para otro caso, aunque no se como la emplea la verdad para ese caso.

La opción de llevarte a otra hoja lo filtrado me parece buena opción, de esa forma en la hoja "filtro" puedes poner los títulos y cargarlos con rowsource

La propiedad ListFillRange, se utiliza para controles creados en la hoja o controles activex, pero creo que tus controles están en el userform.

Saludos. DAM

Ahh no sabia que solo se podía emplear esa propiedad para cuando el control está en la hoja,soy nuevo en esto de programación y hay cosas que todavía no se bien. Al final decidí hacerlo con el filtro avanzado y copiarlo desde la hoja filtro y sale como pretendía. Muchas gracias por su ayuda!!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas