Colaboración: Borrar registros desde un ListBox en Excel vba

Autor invitado: Ismael Romero, MVP

En este post veremos la manera de eliminar items desde un ListBox, con una selección múltiple, de una sola vez, diferentes registros de una base de datos en nuestra hoja de cálculo.

Partiremos de una Tabla en el rango A1:A7 llamada TblPais y de un UserForm con un ListBox de nombre LstPais y un botón de comando cmdBorrado.

Elegimos diferentes items en el ListBox

Figura 1. Elegimos diferentes items en el ListBox.

El objetivo es que después de seleccionar uno o varios elementos del ListBox, y tras presionar el botón de borrado, se eliminen dichas celdas de la tabla origen.

Para ello en la ventana de código del UserForm en el editor de VB añadiremos un primer evento _Initialize asociado al UserForm que realice la carga de elementos en el ListBox empleando la propiedad RowSource.

Así mismo habilitaremos la propiedad MultiSelect para permitir la selección múltiple, y la propiedad ListStyle para mostrar unos cuadros de selección para cada elemento (puramente estético).

Código vba de la macro

Private Sub UserForm_Initialize()
'cargamos el listbox con los valores de la Tabla en la hoja de cálculo
Me.LstPais.RowSource = "TblPaises[paises]"
'asignamos propiedades para selecciones múltiples
Me.LstPais.MultiSelect = fmMultiSelectMulti
'y que aparezca un botón de seelccion al lado de cada elemento
Me.LstPais.ListStyle = fmListStyleOption
End Sub

Por otra parte, el código vinculado al evento Click del botón de comando sería:

Private Sub cmdBorrado_Click()
If Me.LstPais.ListIndex >= 0 Then
For elto = (Me.LstPais.ListCount - 1) To 0 Step -1
    If Me.LstPais.Selected(elto) = True Then
        Dim sEncontar As String, rngBusqueda As Range
        'trabajamos sobre el elemento del listbox seleccionado
        Select Case Me.LstPais.List(elto)
            'en caso haya alguno seleccionado
            Case Is <> ""
                'definimos el valor/pais a encontrar
                sEncontrar = Me.LstPais.List(elto)
                'determinamos dónde buscar 8en qué rango)
                With ActiveSheet.Range("TblPaises[paises]")
                    Set rngBusqueda = .Find(what:=sEncontrar)
                    'si se ha encontrado el valor/país
                    If Not rngBusqueda Is Nothing Then
                        'marcamos esa celda en la hoja de cálculo
                        'y eliminamos desplazando el resto hacia arriba
                        rngBusqueda.Delete shift:=xlUp
                    End If
                End With
            'para el resto de casos salimos del procedimiento
            Case Else
                Exit Sub
        End Select
    End If
Next elto
End If
'volvemos a cargar el ListBox con el resultado de la hoja de cálculo
Me.LstPais.RowSource = "TblPaises[paises]"
End Sub

Este procedimiento básicamente recorre los diferentes elementos del LixtBox en busca de aquellos marcados. En caso de haber elementos marcados, realiza una búsqueda (con el método Find) para localizar su posición en la hoja de cálculo y proceder a su eliminación.

La macro acaba cargando de nuevo en el ListBox los países resultantes que ha permanecido después del borrado.

Descargar el ejemplo

Descargar el ejemplo Borrar Registros Desde Listbox MultiSelect  -ExcelForo.zip

You may also like...