¿Cómo eliminar registros filtrados en un listbox y se vea reflejado en la hoja ?

Que tal amigos de todoexpertos.com, quisiera hacer una consulta acerca de ¿cómo eliminar registros filtrados en un listbox?, tengo un código para eliminación, pero después de aplicar un filtrado selecciono el item a eliminar y no me elimina correctamente.

En una hoja de excel manejo un formulario que busca información en un listbox, este formulario contiene dos botones; 1.- modificar, 2.- eliminar, el problema es con el segundo botón ya que cuando filtro registros y se encuentran dos o mas registros con un mismo código no me elimina el que selecciono sino el primero que encuentra, he estado dándole un par de vueltas y no logro resolverlo, espero me puedan brindar un poco de su ayuda para llegar a una solución. Desde ahora agradezco su tiempo, gracias.

Código de eliminación:

Private Sub UserForm_Initialize()
    Lista
Range("B4").Select
Combo_Criterio.Clear
Do Until ActiveCell = ""
Combo_Criterio.AddItem ActiveCell
ActiveCell.Offset(, 1).Select
Loop
End Sub
´.........................................................................
Sub Lista()
'le decimos cuántas columnas tendrá
LisDts.ColumnCount = 15
'que sí que tiene encabezado
LisDts.ColumnHeads = True
'el origen de datos en nuestra hoja de cálculo
LisDts.RowSource = "Tabla1"
End Sub
´.........................................................................
Private Sub LisDts_Click()
items = Me.LisDts.ListCount
For i = 0 To items - 1
If Me.LisDts.Selected(i) Then
filactiva = Me.LisDts.List(i)
End If
Next i
End Sub
.........................................................................
Private Sub CommandButton1_Click()
If LisDts.ListIndex = -1 Then: Exit Sub 
If LisDts.List(LisDts.ListIndex, 0) = "" Then: Exit Sub 
If MsgBox("Deseal eliminar el " & LisDts.List(LisDts.ListIndex, 0) & "?", vbQuestion + vbYesNo) = vbYes Then
Hoja1.Rows(LisDts.ListIndex + 5).Delete
Lista '
Else
    Exit Sub
End If
End Sub

1 Respuesta

Respuesta
2

Revisando tu macro tienes esto para cargar tu list:

LisDts.RowSource = "Tabla1"

Si en la tabla tienes 6 registros así:

        A

1    Dato1

2    Dato2

3    Dato2

4    Dato2

5    Dato3

Si lo cargas en el listbox, tienes esto

index    columna(0)

0             Dato1

1             Dato2

2             Dato2

3             Dato2

4             Dato3

Y filtras por Dato3, entonces la Tabla te queda esto:

             A

5       Dato3

¿Correcto?

Y en listbox te queda esto:

Index columna(0)

0             Dato3


Después de la explicación con ejemplos, si quieres borrar el registro 3, definitivamente no sabes en cuál fila de la "Tabla" se encuentra, en mi ejemplo el Dato3, se encuentra en la fila 5, pero en el index del listbox solamente tengo un 0 (cero), ¿entonces cómo lo elimino?

Te muestro 2 formas.

La primera y la más práctica. Que uno de los datos de tu "Tabla" se único como un ID o una llave que sea única en todos los registros, si tienes eso, cuando vayas a borrar buscas ese dato en la "Tabla" y de esa forma obtienes la fila a borrar.

La segunda forma es, si no tienes una llave única, entonces en una columna nueva de la "Tabla" pone le número de fila de excel. Cuando borres, tomas el número de fila que se cargó en el list y entonces borras esa fila.

Saludos. Dante Amor

Si es lo que necesitas.

Hola Dam, gracias por responder. Como lo mencionas también pensé en esa opción de un valor único, el pero que encuentro es que tendría forzosamente que buscar por ese criterio y como en el formulario se busca por todos los encabezados que tiene la tabla no me serviría de mucho, ya que si busco por otro criterio volvería a confundir las filas eliminadas. 

Entonces tienes que utilizar la opción 2

Te describo lo que tienes que hacer antes de cargar el listbox.

En una columna adicional a tu "tabla" numera del número 1 hasta el último dato que tengas en tu "tabla", esa columna también la cargas en el listbox.

Cuando elimines consulta ese número que almacenaste y entonces elimina la fila de la hoja que dice ese número.

Si tienes dificultades para hacerlo en la macro envíame tu archivo, me dices en qué fromulario en qué listbox estás cargando y en qué hoja están los datos.

Recuerda poner tu nombre de usuario en el asunto del correo

Dam, te envíe un correo.

Te anexo le código del evento change:

Private Sub CmpNom_Change()
    Dim uf As Integer
    [B1:B2] = ""
    [B1] = Combo_Criterio.Text
    [B2] = CmpNom.Text
    uf = [B65536].End(xlUp).Row
    [Q5] = "5"
    [Q6] = "6"
    If uf > 6 Then
        [Q5:Q6].AutoFill Destination:=Range("Q5:Q" & uf)
    End If
    Range("B4:Q" & uf).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
    "B1:B2"), CopyToRange:=Range("AA1:AP1"), Unique:=True
    uf = [aa65536].End(xlUp).Row
    LisDts.ColumnCount = 16
    LisDts.RowSource = "AA2:AP" & uf
End Sub

El código LisDts_Click, ya no se utiliza.


El código del botón eliminar

Private Sub CommandButton1_Click()
    If LisDts.ListIndex = -1 Then: Exit Sub 'En caso de que no tener que eliminar
    If LisDts.List(LisDts.ListIndex, 15) = "" Then: Exit Sub 'En caso de que no tener datos
    fila = LisDts.List(LisDts.ListIndex, 15)
    If MsgBox("Desea eliminar el " & LisDts.List(LisDts.ListIndex, 15) & "?", vbQuestion + vbYesNo) = vbYes Then 'listindex,15 (columna 15?)
        Hoja1.Rows(fila).Delete
        CmpNom_Change
        'Lista '
    Else
        Exit Sub
    End If
End Sub

Saludos.Dante Amor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas