jueves, 25 de enero de 2018

VBA: Otra forma de cargar y eliminar elementos de un ListBox

En la entrada anterior vimos cómo emplear el método .RemoveItem para eliminar elementos de un ListBox cargados con .AddItem...

Hoy veremos una alternativa a la carga de datos en un ListBox a partir de datos en la hoja de cálculo, y cómo gestionar su borrado.


Partimos de una tabla de países (TblPaises) en la hoja de cálculo y un UserForm creado que contiene un ListBox al que hemos renombrado como 'LstPais'.

VBA: Otra forma de cargar y eliminar elementos de un ListBox



El trabajo consiste en cargar el ListBox en el evento _Initialize del formulario, lo que conseguimos al emplear la propiedad .List y llevar a este 'lista' el rango indicado (Range("TblPaises[paises]")).

Por otra parte en el procedimiento 'RecargaListBox' procedemos a redefinir el rango continuo o discontinuo de celdas resultate después de eliminar un elemento del ListBox.

El rango resultante será cargado de nuevo en el ListBox a través del evento _DblClick, donde se produce el control de borrado o carga de elementos...


Así pues añadimos los siguiente códigos dentro de la ventana de código de nuestro UserForm en nuestro proyecto de VB:

Dim rngPaises As Range

Private Sub UserForm_Initialize()
With Range("TblPaises[paises]")
    'Llenamos el ListBox LstPais con los elementos del rango
    Me.LstPais.List = Application.Transpose(.Cells)
    'Cargamos el rango con los paises que aparecen en esas celdas
    Set rngPaises = .Cells
End With
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub LstPais_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
Dim filas As String

For i = (Me.LstPais.ListCount) To 1 Step -1
    If Me.LstPais.Selected(i - 1) = True Then
        'eliminamos el elemento seleccionado
        Me.LstPais.RemoveItem (i - 1)
    Else
        'con el resto obtenemos una cadena de texto con los número de filas con datos
        filas = filas & (i + 1) & "-"
    End If
    'deseleccionamos el elemento activo después del borrado
    On Error Resume Next
    Me.LstPais.Selected(Me.LstPais.ListCount - 1) = False
    On Error GoTo 0
Next i
'en caso la cadena de texto 'filas' tenga contenido
'quitamos el último caracter/separador añadido...
If Not filas = "" Then RecargaListBox Left(filas, Len(filas) - 1)
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub RecargaListBox(filas As String)
Dim addr As String
Dim ifila As Variant
'declaramos una matriz para cargarla con las direcciones de las celdas con datos
Dim arrFila As Variant

'partimos en elementos individuales la cadena de celdas..
arrFila = Split(filas, "-")
For ifila = UBound(arrFila) To LBound(arrFila) Step -1
    addr = addr & rngPaises.Item(arrFila(ifila)).Address & ","
Next ifila

'en caso la cadena de texto 'addr' tenga contenido
'quitamos el último caracter/separador añadido...
If Not addr = "" Then addr = Left(addr, Len(addr) - 1)
'recargamos el rango con los paises resultantes...
Set rngPaises = rngPaises.Parent.Range(addr)
End Sub



Se puede comparar con el resultado de la entrada anterior, y comprobarse que es similar...

No hay comentarios:

Publicar un comentario