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.
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