miércoles, 11 de marzo de 2015

VBA: Visualizar el último elemento de un ListBox en un UserForm.

Aprenderemos hoy algo nuevo sobre los ListBox en nuestros UserForm, en concreto veremos cómo conseguir que nuestro ListBox, en especial en aquellos casos con muchos elementos, muestre el último elemento de la Lista.
Con esto trataré de dar respuesta a la cuestión planteada por un lector:
...En un Listbox de VBA Excel que me muestra  una hoja Excel  con datos que estoy ingresando  desde un userform, quiero ver la ultima fila  que ingreso,  Actualmente  solo  muestra  el encabezado y los  disponibles dentro de la ventana, y para ello  debo  recurrir  a la barra  de desplazamiento...


La idea es clara, que tras introducir valores/elementos nuevos en nuestra lista, se muestre NO el primero de los elementos, sino el último...

Partiremos de una pequeña lista en nuestra hoja de cálculo:

VBA: Visualizar el último elemento de un ListBox en un UserForm.



A continuación construiremos un UserForm con los siguientes controles:
3 labels
3 TextBox: TxtNombre, TxtZona y TxtImporte
1 CommandButton: CmdAgregar
1 ListBox: Lista

como sigue:

VBA: Visualizar el último elemento de un ListBox en un UserForm.



De especial, para el ListBox ajustaremos las propiedades:
.ColumnCount=3
.ColumnHeads=True

VBA: Visualizar el último elemento de un ListBox en un UserForm.



Finalmente incorporamos funcionalidad, desde la ventana de código del nuestro Formulario disponemos los siguientes eventos:

Private Sub UserForm_Initialize()
Me.TxtNombre.Value = ""
Me.TxtZona.Value = ""
Me.TxtImporte.Value = ""

Me.TxtNombre.SetFocus

'cargamos el ListBox
Dim UltFila As Long, strRng As String
UltFila = Hoja1.Range("A" & Rows.Count).End(xlUp).Row
strRng = "A2:C" & UltFila
Lista.RowSource = strRng

End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CmdAgregar_Click()
Dim UltFila As Long
UltFila = Hoja1.Range("A" & Rows.Count).End(xlUp).Row + 1

'completamos el dato
Hoja1.Cells(UltFila, 1).Value = Me.TxtNombre.Value
Hoja1.Cells(UltFila, 2).Value = Me.TxtZona.Value
Hoja1.Cells(UltFila, 3).Value = CDbl(Me.TxtImporte.Value)

'refrescamos el listbox
Dim strRng As String
strRng = "A2:C" & UltFila
Lista.RowSource = strRng

'mostramos el último valor añadido en el ListBox
'Lista.Selected(Lista.ListCount - 1) = True 'seleccionando el último item de la Lista...
Lista.TopIndex = Lista.ListCount - 1        'sin seleccionar el valor....

'limpiamos el formulario...
Me.TxtNombre.Value = ""
Me.TxtZona.Value = ""
Me.TxtImporte.Value = ""

Me.TxtNombre.SetFocus
End Sub



Existirían, al menos, dos maneras de conseguir nuestra meta, una podría ser empleando la propiedad .Selected, la otra con la propiedad .TopIndex; la diferencia entre una y otra es que .Selected dejará marcado el último elemento.. mientras que con .TopIndex únicamente visualizamos (ver filas de código 31 y 32 !!).
Así dependerá de lo que queramos.


Podemos ver el efecto aquí:

VBA: Visualizar el último elemento de un ListBox en un UserForm.

2 comentarios:

Nota: solo los miembros de este blog pueden publicar comentarios.