Eliminar el registro seleccionado en un ListBox. Error 1004 ¿?

Mediante este código:

Sub ELIMINAR_Click()
Dim Cuenta As Integer
Dim Pregunta As Byte
Dim Filas As Integer
Dim Rango As Range
Dim i As Integer
Dim ID As String
Dim FilaEncontrada As Integer
Cuenta = Me.ListBox1.ListCount
    If Cuenta = 0 Then Exit Sub
Pregunta = MsgBox("¿Está seguro de eliminar el registro seleccionado?", vbYesNo + vbQuestion)
If Pregunta = vbYes Then
Filas = Sheets(7).Range("A1").CurrentRegion.Rows.Count
Set Rango = Sheets(7).Range("A2:A" & Filas)
For i = 0 To Cuenta - 1
    If Me.ListBox1.Selected(1) = True Then
    ID = Me.ListBox1.List(i)
    FilaEncontrada = Rango.Find(what:=ID, MatchCase:=False, lookat:=xlWhole).Row
    End If
Next i
Sheets(7).Rows(FilaEncontrada).EntireRow.Delete
Call BUSCAR_Cod_Click
End If

... Pretendo eliminar un registro de la base de datos contenida en la hoja (7) de un libro .xlsm, que selecciono del listado figurado en un ListBox alojado en un UserForm del libro en cuestión.

Pero al ejecutar el código, VBA me lanza el error que he escrito en la pregunta sombreándome el editor en amarillo la línea que figura casi al final del código:

Sheets(7).Rows(FilaEncontrada).EntireRow.Delete

¿?

2 Respuestas

Respuesta
2

Si tu hoja está protegida sin tilde en el permiso para 'Eliminar filas' registros tendrás que agregar las instrucciones de desprotección y protección desde esta misma macro.

Reemplaza tu línea Sheets(7). Rows(FilaEncontrada). EntireRow.Delete  por estas otras.

With Sheets(7)
    .Unprotect "tu_clave"     'quitar el texto si no tiene clave
    .Rows(FilaEncontrada).EntireRow.Delete
         'quitar el texto de la clave si no corresponde y agregar el resto de los argumentos
    .Protect "tu_clave"
End With

Hola Elsa   : - )

Justo, justo, justo, cuando me saltó el error me dije lo mismo: eso es porque la hoja está protegida!, así que para la línea que me lo dio dispuse lo que me has dicho, desprotección y protección, pero pese a ello me volvió a dar el mismo error. Después reparé en que la 'hoja (7)' es la única que no está protegida en el libro.

En esta ocasión he incluido en el código, literalmente, la estructura 'With/End With' que me apuntas, por si acaso, pero me temo que sigo en las mismas  :'-(

También he intentando cambiando el índice (7) de la hoja por su alias encerrado entre paréntesis y comillas, pero nada...

Entonces, no es un tema de protección.

Revisando nuevamente tu código, fijate que das por asumido que se está encontrando el dato buscado... y puede que no sea así.

Siempre que utilices 'Find' debes evaluar si el dato fue encontrado o no.

Más ejemplos en el video N° 16 de mi canal.

Tendrías que evaluar antes si 'FilaEncontrada' tiene algún valor de fila. Por ejemplo:

If FilaEncontrada > 0 Then Sheets(7).Rows(FilaEncontrada).EntireRow.Delete

Sdos!

¡Gracias!  Dante, me funcionó a las mil maravillas.  : - )

Para terminar con el tema 100 x 100: ¿cómo podría implementar el código que me pasas 'refrescando' el listbox para que, una vez eliminado el registro, su fila desaparezca del listbox?

P.S.- Visto tu vídeo de buenas maneras para la declaración de variables    : - )    Gracias.

Respuesta
2

Visita:

Cursos de Excel y Macros - YouTube


Tienes algunos detalles en tu código:

Si solamente vas a seleccionar un registro a borrar, no es necesario hacer un ciclo:

For i = 0 To Cuenta - 1
   If Me.ListBox1.Selected(1) = True Then   

Por cierto, en el Selected tienes un número uno, deberías tener la variable i.

Pero como solamente vas a eliminar el registro seleccionado, puedes realizarlo de la siguiente manera.

Realicé la declaración adecuada de las variables y solamente dejé las necesarias:

Sub ELIMINAR_Click()
  Dim i As Long
  Dim Pregunta As VbMsgBoxResult
  Dim Rango As Range, f As Range
  '
  With Me.ListBox1
    If .ListCount = 0 Then Exit Sub
    If .ListIndex = -1 Then Exit Sub  'no seleccionó registro
    '
    Pregunta = MsgBox("¿Está seguro de eliminar el registro seleccionado?", vbYesNo + vbQuestion)
    If Pregunta = vbYes Then
      Set Rango = Sheets(7).Range("A2", Sheets(7).Range("A" & Rows.Count).End(3))
      Set f = Rango.Find(.List(.ListIndex), , xlValues, xlWhole, , , False)
      If Not f Is Nothing Then
        f.Rows.Delete
      End If
      'Call BUSCAR_Cod_Click
    End If
  End With
End Sub

Te recomiendo el siguiente vídeo:

Consejos para desarrollar macros . curso de excel, curso de macros, excel, macros - YouTube

Sal u dos

¡Gracias, Dante!


¡Gracias!  Dante, me funcionó a las mil maravillas.  : - )

Para terminar con el tema 100 x 100: ¿cómo podría implementar el código que me pasas 'refrescando' el listbox para que, una vez eliminado el registro, su fila desaparezca del listbox?

P.S.- Visto tu vídeo de buenas maneras para la declaración de variables    : - )    Gracias.

Problemas, Dante.

Después de comprobar más en profundidad tu código yo diría que me elimina el ID identificativo del registro -su primera columna- pero no el resto de las columnas, es decir no elimina la FilaEntera. Tengo que verificarlo pero creo que es así...

Creo haberlo solucionado introduciendo un EntireRow en la línea: "f.Rows.EntireRow.Delete"

P.S.- Ya solo me quedaría lo del 'refrescado' del ListBox.

Para refrescar el listbox, utiliza el mismo código que usas para cargar el listbox.

Si estás utilizando la propiedad List, por ejemplo, después de borrar el registro pon lo siguiente:

.List = Sheets(7).Range("A2", Sheets(7).Range("A" & Rows.Count).End(3)).Value

Visita:

Cursos de Excel y Macros - YouTube

Perdona, Dante, con lo que me has mandado solo me refresca la primera columna del ListBox, ¿cómo hago para que me refresque el resto de columnas?  : - )

Es un ejemplo.

Debes realizar esto:

Para refrescar el listbox, utiliza el mismo código que usas para cargar el listbox.

¡Gracias!  Dante.

Me ha costado un poco interpretar al 100x100 lo que querías decirme pero al final lo he conseguido... es que tenía hasta 8 botones de comando que dependiendo de lo que escribía en los txt de búsqueda contiguos a ellos me llenaban en listbox de acuerdo a la búsqueda que para cada uno de ellos me ofrecía la bd y me había liado... :)

Repito: gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas