Error borrar elemento, seleccionando desde listBOX (VBA)

Ando necesitando ayuda con un código de VBA que me tira error:
Necesito:
1- Seleccionar un elemento desde el ListBox llamado LISTA
2-Validad si se selecciono o un valor ( por eso el primer IF)
3- Una vez validad que se selecciono un valor, buscarlo en la hoja "base de datos" y eliminar la fila de la tabla ( actualmente estoy borrando toda la fila, pero porque no se como se hace para borrar solo la fila de tabla)
el primer IF de validación ( funciona correctamente)
El problema surge cuando selecciono un valor y le digo que lo borre, me tira error variable de objeto o bloque with no establecido excel
les dejo abajo el código, para ver si me pueden decir que esta mal ( tal vez el código se pueda escribir más corto o mejor, pero no conozco mucho del tema, estoy aprendiendo )

Private Sub CommandButton3_Click() '
Cuenta = Me.LISTA.ListCount
Set Rango = Range("A1").CurrentRegion
For i = 0 To Cuenta - 1
If Me.LISTA.Selected(i) Then
valor = Me.LISTA.List(i)
End If
Next

Sheets("nuevo paciente").Select
Range("B10").Select
Sheets("base de datos").Visible = True
Sheets("base de datos").Select
Range("C9").Select
Cells.Find(What:=valor, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
If ActiveCell = Empty Then MsgBox ("No se selecciono registro o el registro no existe")
If ActiveCell <> Empty Then Selection.EntireRow.Delete

Range("A11").Select
Sheets("base de datos").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("nuevo paciente").Select
Range("F5").Select
Me.LISTA.RowSource = "Base_datos"
Hoja4.AutoFilterMode = False
Me.LISTA = Refresh
Me.LISTA.RowSource = Refresh
y = 0

End Sub

2 Respuestas

Respuesta
2

Te dejo un código bastante diferente pero creo más preciso. Se ejecutará al hacer doble clic en algún elemento de la lista.

Entiendo que tu lista tiene asignado un nombre de rango en Rowsource (Base_datos). No comentás cuántas columnas tiene así que asumo será 1 sola.

Doble clic a la lista y allí copiá este código:

Private Sub LISTAS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'verifica si se seleccionó algún elemento
If LISTAS.ListIndex < 0 Then
    MsgBox "Seleccione un elemento de la lista."
    Exit Sub
End If
valor = LISTAS.List(LISTAS.ListIndex)
'se busca el elemento seleccionado en hoja ..... col C  ...ajustar
Set busco = Sheets("base de datos").Range("C:C").Find(valor, LookIn:=xlValues, lookat:=xlWhole)
'si lo encuentra elimina solo esa celda
If Not busco Is Nothing Then
    busco.Delete
End If
End Sub

Está buscando el dato en toda la col C, aquí ajustá el rango a tu criterio.

Solo está eliminando la celda encontrada, si necesitas que elimine varias columnas de la misma fila podrías utilizar:

Range("C" & busco.row & ":E" & busco.row).delete

Muchas gracias por la ayuda, renegué un poco ( por falta de conocimiento más que nada) y pude ir adaptándolo a mi macro gracias a que estaban las anotaciones y explicación de que es cada cosa del código.
El código quedo distinto, debido a que si o si lo tengo que operar desde el botón, y no con un doble clic en la fila, para evitar posibles errores por parte del usuario del programa

Private Sub CommandButton3_Click() '
If LISTA.ListIndex < 0 Then
MsgBox "Seleccione un elemento de la lista."
Exit Sub
End If
Sheets("nuevo paciente").Select
Range("B10").Select
Sheets("base de datos").Visible = True
Sheets("base de datos").Select
valor = LISTA.List(LISTA.ListIndex)
Set busco = Sheets("base de datos").Range("B:K").Find(valor, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
Range("B" & busco.Row & ":K" & busco.Row).Delete
End If
Range("A11").Select
Sheets("base de datos").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("nuevo paciente").Select
Range("F5").Select

Nombre_paciente_Change

End Sub

Respuesta
1

¿

¿Corrígeme si me equivoco te estas manejando a base de tablas que hiciste con la instrucción insertar tabla?, de ser así tienes que nombrar a la tabla que tienes en la hoja base de datos como pacientes esto es fácil solo da click en cualquier celda dentro de la tabla, en el menu seleccionas diseño y arriba a la izquierda veras un recuadro que dice nombre de la tabla, hay le das el nombre a la tabla

Luego insertas esta macro en tu formulario, te va a cargar los datos de la tabla lista en el combobox, luego tu seleccionaras en el cual registro va a borrar de la tabla pacientes, (por cierto ya trae la instrucción para borrar solamente la fila de la tabla), te pedirá una confirmación y después de eso hará el borrado y actualizara el listbox.

Private Sub CommandButton3_Click()
Set PACIENTES = Range("pacientes")
PACIENTE = Lista.Value
valida = PACIENTE < 0 Or PACIENTE = Empty
MENSAJE = "PACIENTE NO EXISTE O DEJASTE EL CAMPO EN BLANCO"
MENSAJE2 = "PACIENTE " & PACIENTE & " ENCONTRADO, BORRAR?"
MENSAJE3 = "REGISTRO BORRADO, DAR CLICK PARA ACTUALIZAR LA LISTA"
AVISO = "AVISO EXCEL"
If valida Then
    MsgBox (MENSAJE), vbCritical, AVISO
Else
    FILA = WorksheetFunction.Match(PACIENTE, PACIENTES.Columns(1), 0)
    N = MsgBox(MENSAJE2, vbYesNo, AVISO)
    CONFIRMA = N = 6
    If CONFIRMA Then
         PACIENTES.ListObject.ListRows(FILA).Delete
         MsgBox (MENSAJE3), vbInformation, AVISO
        CARGAR
    End If
End If
End Sub
Private Sub UserForm_Initialize()
CARGAR
End Sub
Sub CARGAR()
matriz = Range("pacientes").Columns(1)
With Lista
   .ColumnCount = Range("pacientes").Columns.Count
    .List = matriz
End With
End Sub

¡Gracias! 
Trate de implementarlo pero me tiro un par de problemas ( errores míos, de no haberme dado cuenta de que partes tenía que cambiar para que se adapte a mi macro), y cuando me di cuenta cómo tenía que hacerlo, ya había logrado hacer funcionar el macro con el código de abajo
igual muchisimas gracias por la ayuda  

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas