Borrar imagen en hoja de Excel

Antes que nada quiero agradecer su ayuda anteriormente, he estado aprendiendo mucho de ustedes y mi pequeño proyecto personal va tomando mas forma cada vez aunque aun falta mucho para decir que está terminado, porque como buen programador siempre hay que buscar formas de mejorar lo que se tiene.

Bueno entrando de lleno al caso de hoy:

Mi macro abre un formulario en el que se solicita cierta información, luego con esa información llena unos campos en una hoja de excel para presentar una especie de informe que puede enviarse a imprimir si se desea. Dentro de ese informe se inserta una imagen (.PNG) relacionada a una muestra de como acomodar diferentes tipos de muebles dentro de una habitación. Tengo una imagen por cada diagrama de muestra. Las imágenes están almacenadas en una carpeta llamada img dentro de la ruta en la que mi Libro esta guardado.

'Declaramos variables
Dim RutaActual As String
Dim RangoImagen As Range
'La variable RutaActual guardará la ruta completa donde está el archivo
RutaActual = ThisWorkbook.Path
'Elegimos la celda L6
ActiveSheet.Range("L6").Select
    Set RangoImagen = ActiveCell
    'Insertamos la imagen que corresponda al nombre de la celda indicada
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Pictures.Insert(RutaActual & "\img\" & RangoImagen.Value & ".PNG").Select
    Selection.Width = Selection.Width * 70 / 100 'Ajustar tamaño al 70%
    Selection.Height = Selection.Height * 80 / 100 'Ajustar tamaño al 80%

A un costado de ese reporte puse dos botones, el primero llama al UserForm donde capturo los datos y se inserta la imagen en el reporte. El segundo limpia el reporte y debería borrar la imagen insertada, pero no logro hacerlo, he buscado varios métodos pero no consiguen hacer lo que necesito, incluso encontré un código que elimina todo los objetos tipo Shape que hay en la hoja pero eso también borra los botones de comando y otras imágenes que no quiero que se borren (Logos, firmas, etc).

También encontré esta rutina para borrar imágenes dentro de un rango de celdas definido, pero aunque no me arroja errores y he comprobado que se ejecuta paso por paso, no borra la imagen:

Private Sub CommandButton2_Click()
'Añadimos líneas para eliminar imágenes en el rango A3:D25
'Declaramos variables.
Dim PrimeraFila As Integer, PrimeraColumna As Integer
Dim UltimaFila As Integer, UltimaColumna As Integer
Dim img As Object
Dim tc As Long, tr As Long
PrimeraFila = Range("k6").Row
PrimeraColumna = Range("k6").Column
UltimaFila = Range("o18").Row
UltimaColumna = Range("o18").Column
'Recorre cada objeto de la hoja y valida su posición.
For Each img In ActiveSheet.Shapes
    On Error Resume Next    'controlamos fallo al NO encontrar imágenes
    tc = img.BottomRightCell.Column
    tr = img.BottomRightCell.Row
    If (tc >= PrimeraColumna And tc <= UltimaColumna) And _
       (tr >= PrimeraFila And tr <= UltimaFila) Then
        If img.Type = 11 Then
            'mensaje que muestra la posición de inicio de la imagen
            MsgBox img.Name & "-" & img.Type & "-" & img.TopLeftCell.Address
            img.Delete
        End If
    End If
    On Error GoTo 0
Next
'Range("F7") = ""
'Range("F8") = ""
End Sub

Hay algo que no esté haciendo bien? Las opciones que he intentado no son las indicadas?

Agradezco su ayuda por adelantado... Nuevamente

Respuesta
1

Primero, le pones nombre a la imagen recién insertada

Sub inse()
    RutaActual = ThisWorkbook.Path
    'Elegimos la celda L6
    ActiveSheet.Range("L6").Select
    Set RangoImagen = ActiveCell
    'Insertamos la imagen que corresponda al nombre de la celda indicada
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Pictures.Insert(RutaActual & "\ipn2.jpg").Select
    'ActiveSheet.Pictures.Insert(RutaActual & "\img\" & RangoImagen.Value & ".PNG").Select
    Selection.Width = Selection.Width * 70 / 100 'Ajustar tamaño al 70%
    Selection.Height = Selection.Height * 80 / 100 'Ajustar tamaño al 80%
    Selection.Name = "nueva_imagen"
End Sub

Y cuando la quieras borrar haces referencia al nombre:

Sub borrar_imagen()
    On Error Resume Next
    ActiveSheet.DrawingObjects("nueva_imagen").Delete
    On Error GoTo 0
End Sub

De esa forma, solamente te borra una imagen.


.

.

Pregunta: Tengo un botón para la rutina que inserta la imagen y otro botón para limpiar los contenidos y borrar la imagen, entonces debo declarar "nueva_imagen" como objeto al inicio del segundo botón?

Tienes que poner esta línea después de crear la imagen:

Selection.Name = "nueva_imagen"

Según tu macro , yo la puse al final de estas líneas:

    RutaActual = ThisWorkbook.Path
    'Elegimos la celda L6
    ActiveSheet.Range("L6").Select
    Set RangoImagen = ActiveCell
    'Insertamos la imagen que corresponda al nombre de la celda indicada
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Pictures.Insert(RutaActual & "\ipn2.jpg").Select
    'ActiveSheet.Pictures.Insert(RutaActual & "\img\" & RangoImagen.Value & ".PNG").Select
    Selection.Width = Selection.Width * 70 / 100 'Ajustar tamaño al 70%
    Selection.Height = Selection.Height * 80 / 100 'Ajustar tamaño al 80%
    Selection.Name = "nueva_imagen"

Y en tu botón para borrar y limpiar agrega estás líneas:

    On Error Resume Next
    ActiveSheet.DrawingObjects("nueva_imagen").Delete
    On Error GoTo 0

No tienes que declarar como objeto, es un nombre de la imagen.

La copie tal cual, pero no selecciona la imagen. Tampoco me reconoce DrwingObjects como propiedad de la clase WS, investigando vi que ahora se le denomina Shapes, pero si lo cambio por Shapes me dice que no se encuentra el elemento con el nombre espeicificado. Por eso preguntaba si se tenía que declarar como variable publica que pueda usarse en distintas rutinas

No la tienes que declarar nada.

Envíame tu archivo para ver tu código y te adapta las líneas.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “

Gustavo Armando Hernández González

El botón ejecuta esta macro:

Sub Borra_img()
'
' Borra_img Macro
'
'
    Range("K7:P21").ClearContents
    On Error Resume Next
    ActiveSheet.DrawingObjects("foto").Delete
    On Error GoTo 0
    'Range("f7"). ClearContents
    'Range("f8"). ClearContents
End Sub

.

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas