lunes, 9 de marzo de 2015

VBA: Borrar imágenes de un rango determinado.

A través de un comentario, días atrás, un lector planteaba la cuestión de cómo eliminar unas imágenes con una posición concreta dentro de una hoja de cálculo, manteniendo el resto de las imágenes existentes en la hoja.
Supongamos la situación de la imagen siguiente:

VBA: Borrar imágenes de un rango determinado.



El objetivo es claro, eliminar únicamente las imágenes situadas en el rango A3:D25.
Insertamos y ejecutamos el siguiente procedimiento 'BorrarImgRango':

Sub BorrarImgRango()
'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("A3").Row
PrimeraColumna = Range("A3").Column
UltimaFila = Range("D25").Row
UltimaColumna = Range("D25").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 = 13 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
End Sub

El resultado es:

VBA: Borrar imágenes de un rango determinado.

Notemos que la imagen debe estar en el interior del rango, al menos su punto inferior-derecha, y es que en este ejemplo estamos empleando la propiedad .BottomRightCell que representa la celda que se encuentra debajo de la esquina inferior derecha del objeto.

Podríamos combinar el código con otra propiedad empleada en la línea:

MsgBox img.Name & "-" & img.Type & "-" & img.TopLeftCell.Address

donde la propiedad .TopLeftCell nos retorna la celda superior-izquierda; por tanto, sería posible con una simple modificación del código, eliminar exclusivamente aquellas imágenes que estuvieran completamente en el interior del rango...

2 comentarios:

  1. es posible hacer esto mismo, sin tener que aplicar macros, ya que los que no las controlamos nos cuesta bastante conseguirlo
    un saludo

    ResponderEliminar
    Respuestas
    1. Hola Juan,
      para eliminar imágenes, sin emplear macros las debes seleccionar.. así que para hacerlo sin macros, sea cual sea, siempre deberá pasar por esa selección..
      bien directamente sobre la hoja o bien a través del Panel de Selección...

      Un saludo

      Eliminar