Eliminar imagen desde un listbox vba excel

Tengo en un formulario un listbox, que carga un listado de productos que están en la hoja de calculo, cada uno con su respectiva imagen; tengo ademas un botón de comando que elimina un registro previamente seleccionado del listbox y lo elimina tanto de allí como en la hoja de calculo (ya está programado).

El problema es que la imagen del producto no se borra, obviamente se monta encima de la fila siguiente en la hoja de calculo. (Anexo imagen de ejemplo).

No se si existe una forma de que al eliminar el registro del listbox se elimine también la imagen respectiva de la hoja de calculo.

1 respuesta

Respuesta
2

Con lo siguiente eliminas una imagen

ActiveSheet. DrawingObjects("Picture 1").Delete

Pero debes conocer el nombre de la imagen.

Cuando cargas los datos en el listbox, también cargas la imagen en el listbox, ¿qué código utilizas?

¿O cuándo borras los datos de excel qué código utilizas?

Muchas gracias por tu ayuda.

No, solo en el Listbox cargo los campos alfanuméricos, no sé si haya una forma de cargar las imágenes también, aunque no son necesarias en lo que estoy haciendo.

Te muestro el código que utilicé para eliminar los datos tanto en el listbox como en la hoja de calculo.

BOTON ELIMINAR
Set a = Sheets("formato")
filaedit = a.Range("C" & Rows.Count).End(xlUp).Row 'Variable que busca ultima fila con datos
fila = ListBox1.ListIndex 'Variable que indica el indice del dato a buscar
cod = UserForm1.ListBox1.List(fila, 1) 'Variable que busca el dato exacto que esta en el listbox y en excel
rpta = MsgBox("Esta seguro que desea Eliminar " & cod & " del Formato de Cotización?", vbYesNo, "Advertencia")

If rpta = vbYes Then
ListBox1.RemoveItem (ListBox1.ListIndex) 'Elimina el registro buscado del listbox
Set codigo = a.Range("C20:C" & filaedit).Find(cod, LookIn:=xlValues, LookAt:=xlWhole) 'busca el dato en Excel, coincidente con el del listbox

If Not codigo Is Nothing Then 'Si el renglon no esta vacío
dire = codigo.Row 'Fila exacta donde se encontró el dato
a.Cells(dire, "C").EntireRow.Delete 'Elimina la fila buscada de la hoja de calculo
End If
MsgBox "Producto Eliminado de la Cotización Exitosamente", vbOKOnly, "Felicitaciones"
Else
Cancel = 1

End If

de antemano Muchas gracias por tu colaboración.

Si cambias la propiedad de la imagen a "Mover y cambiar tamaño con celdas", debería borrar la imagen cuando eliminas la fila.

De cualquier forma, anexo el código para borrar la imagen de la fila y la columna "E". Cambia "E" por la columna donde tienes la imagen.

Prueba lo siguiente:

Private Sub CommandButton1_Click()
  Dim a As Worksheet, codigo As Range
  Dim fila As Long, filaedit As Long, dire As Long
  Dim cod As Variant, rpta As Variant, cancel As Boolean
  Dim shp As Shape
  Set a = Sheets("formato")
  filaedit = a.Range("C" & Rows.Count).End(xlUp).Row 'Variable que busca ultima fila con datos
  fila = ListBox1.ListIndex 'Variable que indica el indice del dato a buscar
  cod = UserForm1.ListBox1.List(fila, 1) 'Variable que busca el dato exacto que esta en el listbox y en excel
  rpta = MsgBox("Esta seguro que desea Eliminar " & cod & " del Formato de Cotización?", vbYesNo, "Advertencia")
  If rpta = vbYes Then
    'ListBox1.RemoveItem (ListBox1.ListIndex) 'Elimina el registro buscado del listbox
    Set codigo = a.Range("C20:C" & filaedit).Find(cod, LookIn:=xlValues, LookAt:=xlWhole) 'busca el dato en Excel, coincidente con el del listbox
    If Not codigo Is Nothing Then 'Si el renglon no esta vacío
      dire = codigo.Row 'Fila exacta donde se encontró el dato
      For Each shp In a.Shapes
        If Not Intersect(shp.TopLeftCell, a.Cells(dire, "E")) Is Nothing Then
          shp.Delete
        End If
      Next
      a.Cells(dire, "C").EntireRow.Delete 'Elimina la fila buscada de la hoja de calculo
    End If
    MsgBox "Producto Eliminado de la Cotización Exitosamente", vbOKOnly, "Felicitaciones"
  Else
    cancel = 1
  End If
End Sub

Muchas gracias Dante, quedó excelente, funciona perfectamente.

Quería pedirte sólo un último favor y me digas que función tiene el código o método?  Intersect y que me expliques el significado de estos 2 renglones.

For Each shp In a.Shapes
If Not Intersect(shp.TopLeftCell, a.Cells(dire, "E")) Is Nothing Then

Nuevamente mil y mil gracias por tu ayuda.

For Each shp In a.Shapes
If Not Intersect(shp.TopLeftCell, a.Cells(dire, "E")) Is Nothing Then

Es un ciclo que realiza para cada objeto "shape" en la hoja, pueden ser imágenes o formas.

Lo que haces es preguntar si la esquina superior izquierda (TopLeftCell) del objeto (shp) está dentro (intersect) de la celda cells(fila, "E"). Si está dentro entonces borra el objeto (shp. Delete).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas