domingo, 13 de mayo de 2012

VBA: Una macro de Excel para borrar sólo imágenes entre objetos.

Como principio a una serie de artículos, comenzaré hoy explicando cómo podemos borrar las imagenes (Picture) de una hoja de cálculo, pero sólo las imágenes(Picture)!!, respetando el resto de objetos existentes, como botones, autoformas, gráficos, etc...
Esto es importante en muchos casos cuando queremos 'hacer limpieza' en nuestra hoja de Excel, pero limitada a cierto tipo de objetos.

En primer lugar, para generalizar nuestra macro de hoy, necesitaremos tener conciencia de cómo identifica Excel estos objetos, cómo los diferencia. Para ejemplarizarlo veremos la imagen siguiente donde observamos varias imágenes, junto a otros objetos (dos Botones, un Gráfico, un Rectángulo de texto, una autoforma ovalada):

VBA: Una macro de Excel para borrar sólo imágenes entre objetos.


Usando una instrucción Type sobre cada objeto, veremos de manera muy sencilla, qué identificador único usa Excel para cada objeto.
Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, dándo forma a nuestra macro de Excel:

Sub TipoObjetos()
Dim img As Shape
On Error Resume Next
For Each img In ActiveSheet.Shapes
    MsgBox img.Name & " " & img.Type
Next
End Sub


Al ejecutar esta macro, idetificamos mediante un Cuadro MsgBox el nombre del objeto, y al lado el tipo o identificador. Como vemos en la imagen siguiente para dos de los objetos, lo importante es que para todas las imágenes (Picture) el tipo tiene el valor 11, y por ejemplo el gráfico el valor 3, o la autoforma Ovalada el valor 1.
Para nosotros, el valor 11 de las imágenes es lo importante.

VBA: Una macro de Excel para borrar sólo imágenes entre objetos.


Con la clave descubierta, lo que sigue es lo más sencillo, ya que construiremos una nueva macro, similar a la anterior:
Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, dándo forma a nuestra macro de Excel:

Sub borrarImagenes()
Dim img As Shape
On Error Resume Next
For Each img In ActiveSheet.Shapes
     If img.Type = 11 Then img.Delete
Next
End Sub


Y al ejecutarla podremos observar cómo elimina o borra sólo los objetos tipo imágen, dejando el resto visibles y con todas sus funcionalidades...

VBA: Una macro de Excel para borrar sólo imágenes entre objetos.


En siguientes entradas aprederemos a Listar los ficheros exitentes en una carpeta de nuestro PC, y posteriormente, aprovecharemos esta lista, para insertar imágenes asociadas a esos ficheros, con formatos personalizados.

42 comentarios:

  1. Hola.

    Muchas gracias por éste aporte, muy claro, conciso y práctico.
    En el código para borrar las imágenes cambié:

    If img.Type = 11 Then img.Delete

    Por éste:

    If img.Type = msoPicture Then img.Delete

    Al tipear el signo de igual(=) automáticamente se despliega la ventana con varias opciones.

    Es cuestión sólo de ir viendo cual requerimos.

    Saludos y nuevamente, muchas gracias.
    Ignacio Téllez
    Puebla, México.
    May.29.2012

    ResponderEliminar
    Respuestas
    1. Muchas gracias Ignacio,
      tu aporte es sin duda mucho más general y válido para más casos.
      De nuevo gracias!!!

      Eliminar
  2. Buenisimo el aporte, una pregunta? si no quiero borrar el objeto sino guardarlo en mis documentos en la maquina? como por ejemplo una foto... cuales serian las instrucciones a agregar?

    saludos

    ResponderEliminar
    Respuestas
    1. Hola Fer,
      el asunto no es fácil, ya que no existe una instrucción para guardar las imágenes (objetos) dentro de una hoja de cálculo; una forma de hacerlo sería pegar las imágenes dentro de un objeto gráfico, por que éstos si es posible exportarlos y guardarlos en un archivo en nuestro equipo.
      Subiré la semana que viene la macro que lo realiza.
      Slds

      Eliminar
  3. Buen aporte!! una consulta, y si quisiera borrar solo una forma en particular como seria?? desde ya muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Bien, si sólo quieres borrar una forma en particular
      tendrías que seleccionar dicha forma indicando su nombre:
      ActiveSheet.Shapes("nombre").Delete
      Slds

      Eliminar
  4. Muchas gracias!, te hago otra consulta, como hago para identificar el nombre de la forma???

    ResponderEliminar
    Respuestas
    1. Veo que vamos paso a paso, je, je...
      Discúlpame, pensaba, por el tipo de cuestiones tan directas que hacías, que controlabas algo del tema.
      Para conocer el nombre de la forma no te queda más remedio que pinchar sobre ella con el ratón y en sus propiedades ver el nombre, o también en el Cuadro de nombres; claro, que si no conocer el nombre de la forma que quieres borrar, una macro no te servirá de mucho, ya que en ese procedimiento tendrás que indicarle de alguna manera cuál de todas las formas de la hoja es la que quieres borrar.
      Slds

      Eliminar
  5. Hola, tengo un problema y quiero que me ayudes a resolverlo, por favor: El caso es que necesito manejar informacion en forma texto, quiero que al ingrasar a cierta casilla esta me arroje informacion por ejemplo: tengo la ubicacion de un sitio, ahora quiero que al seleccionar ese sitio en la siguiente casilla me muestra las areas que estan en ese sitio especifico y despues de seleccionar el area que me muestra la actividad o actividades que aplican a esa area de la empresa.

    Agradezco su gentil atencion.

    Deisy Duran

    ResponderEliminar
    Respuestas
    1. Hola Deisy,
      bueno, creo que una validación de datos anidada podría solucionar tu problema.
      Te adjunto algunos post del blog que hablan del tema:
      http://excelforo.blogspot.com.es/2009/10/ejemplo-de-doble-validacion.html
      http://excelforo.blogspot.com.es/2010/04/validacion-de-celdas-anidadas-y.html
      Slds

      Eliminar
  6. Hola buenos dias!
    Tengo varios shapes (rectangulo redondo) y cada uno tiene un numero. como hago para capturar ese numero al hacer clik?

    Desde ya muchas gracias... Gustavo

    ResponderEliminar
    Respuestas
    1. Hola Gustavo,
      bueno, el nombre de cada forma lo pueves ver en el cuadro de nombres, pero para recuperarlo con programación serviría algo así:
      Sub MiMacro()
      Dim forma As Shape
      Set forma = ActiveSheet.Shapes(Application.Caller)
      MsgBox "La forma sobre al que has hecho clic es " & forma.Name
      End Sub

      y luego asociar la macro a cada Autoforma de la que quieras saber su nombre.. así al ahcer clic sobre ella mostrara una ventana de texto con el nombre.

      Espero te sirva.
      Slds

      Eliminar
  7. Ojo con esto, en la línea:
    If img.Type = msoPicture Then img.Delete

    La constante msoPicture tiene el valor de tipo 13 y por lo tanto las imágenes con tipo 11 no son borradas

    ResponderEliminar
    Respuestas
    1. Correcto!
      por eso insitía en la explicación que únicamente las imágenes type 11 (picture).
      Gracis por la puntualización.
      Slds cordiales

      Eliminar
  8. Muy bueno el aporte, pero me surge una duda, si solo queremos quitar las imagenes de un rang determinado, ¿como se hace? probe con esto pero me da error:

    Sub borrarImagenes()
    Dim img As Shape
    On Error Resume Next
    Range("B6:L25").Select
    For Each img In Selection.Shapes
    If img.Type = 11 Then img.Delete
    Next
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      bueno el asunto es algo más complejo... pero no mucho ;-)
      Se trataría de localizar dónde comienzan las formas/imágenes y controlar si están o no dentro del rango indicado con INTERSECT, así:

      Sub borrarImagenes()
      Dim img As Shape
      On Error Resume Next

      For Each img In ActiveSheet.Shapes
      If Not Application.Intersect(img.TopLeftCell, Range("B6:L25")) Is Nothing Then
      If img.Type = msoPicture Then img.Delete
      End If
      Next
      End Sub


      Espero te sirva...
      Slds

      Eliminar
  9. Siii, muchas gracias jeje

    ResponderEliminar
  10. Buenos días a todos. Llevo varias semanas peleandome con las macros (soy autodidacta amateur). Mi pregunta es la siguiente:
    ¿Es posible colocar varias imagenes en el excel vinculadas a una celda "teniendo las imagenes IDENTIFICADAS en todo momento" por codigo... Y aquí viene la pregunta. ¿Es posible que al escribir un texto en la celda( ej. ruta). cree la imagen (buscada en una ruta y la coloque?. ¿Y si reescribo esa celda, me substituya esa imagen?. O sea que el Excel tenga control en todo momento de la imagen. ¿Es mejor hacerlo con una imagen o con imagen de control activex?? ( IMPORTANTE - No quiero tener que crear el marco de imagen ActiveX antes manualmente). sino que al escribir el texto. cree la imagen y la coloque sola. Y si reescribo esa celda, me substituya esa imagen conservando su id. No encuentro la solución!!! :((( gracias majos.

    ResponderEliminar
  11. buen dia.-

    mi amaigo muchas gracias!!!, tu conocimiento me acaba de salvar mi chamba, jajajaja, estaba tratando de borrar las imagenes de un reporte, pero tu respuesta y conocimient fue mas aya de lo ocupaba y termino mejorando mi reporte, me quito el sombrero ante ti.

    gracias.

    ResponderEliminar
    Respuestas
    1. ;-)
      gracias!! me alegro te haya sido de utilidad
      Slds

      Eliminar
  12. Hola, espero me puedan ayudar, tengo un problema con mi macro, lo que hace es mandar imprimir una lista de tarjetas de produccion y en cada una de ellas se debe de imprimir la foto asociada al estilo (es de calzado). Si lo ejecuto con f8 puedo ver como se van cambiando las imagenes sin problema pero al mandar imprimir me deja solo la primera imagen y todas las demas tarjetas salen con la misma foto. Tendran alguna solucion.
    Este es el codigo que estoy usando (disculpen la simpleza pero soy nuevo en programacion en Excel).
    Sub ImpTarjeta()
    Range(“aa2″).Select
    Dim cont As Integer
    cont = 1
    Do While ActiveCell.Value “”
    ‘Aqui creo la cadena para el nombre del archivo
    Range(“q2″).Value = ActiveCell.Value
    Set fso = CreateObject(“Scripting.FileSystemObject”)
    nombre = Range(“aa21″).Value
    ‘ Aqui valido si el archivo existe para que lo ponga en el control de imagen
    If (fso.FileExists(“D:\Documentos\Google Drive\OneDrive\Taller Produccion\Estilos\Imagenes Tarjetas\” & nombre & “.jpg”)) Then
    ActiveSheet.FotoTarjeta.Picture = LoadPicture(“D:\Documentos\Google Drive\OneDrive\Taller Produccion\Estilos\Imagenes Tarjetas\” & nombre & “.jpg”)
    End If
    ‘Selecciono el rango que quiero imprimir y mando la impresion
    Range(“A1:T29″).Select
    Selection.PrintOut Copies:=1, Collate:=True
    cont = cont + 1
    ActiveCell.Offset(0, 9).Select
    ActiveCell.Offset(cont, 0).Select
    Loop
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Francisco,
      el código parece correcto... y como indicas, sobre la hoja puedes ver como cambian.
      Se me ocurre que antes del Loop final añadas un refresco de pantalla:
      ....
      Application.Calculate
      ActiveWorkbook.RefreshAll
      Loop
      End Sub


      Quizá así, después de cada impresión refrescando, se muestre correctamente en la impresión

      Espero te funcione.
      Saludos

      Eliminar
  13. Buenas.

    Tengo esta macro que me sirve para poner una pequeña autoforma dentro de una celda (en la misma fila pero 5 columnas atrás) en función de lo que selecciono en una lista desplegable de otra celda. En una parte de la hoja tengo metidas las autoformas dentro de unas celdas (F58,F59..). Esta operación se puede realizar en cualquier fila del archivo y cambiar valores que ya estaban seleccionados para que cambie también la autoforma, por eso al principio busco en que celda tiene suceso el cambio de valor. Actualmente me funciona pero el proceso tiene un grabe problema que no se revolver, cada vez que cambia el valor de una celda que ya estaba seleccionada tengo que cortar la celda y pegarla en una zona alejada (JL14) de la hoja para que se elimine la anterior autoforma y que no quede debajo de la autoforma de la nueva selección (ya que se ven las dos autoformas una encima de otra), esto me produce que con el paso del tiempo el archivo el archivo ocupe mas y mas tamaño puesto que las autoformas que corto y pego en la zona alejada nunca se borran y no hacen mas que crecer unas sobre otras. He probado con la solución que propones pero solo consigo que se borren todas las autoformas o si defino el rango (en este caso una celda única con valor Cells(fila,columna-5) salta un error que no soy capaz de averiguar.

    Gracias de antemano.

    If ActiveCell = "Valor Añadido" Then
    columna = ActiveCell.Column
    fila = ActiveCell.Row
    Cells(fila, columna - 5).Cut
    Range("JL14").Select
    ActiveSheet.Paste
    Range("F58").Select
    Selection.Copy
    Cells(fila, columna - 5).Select
    ActiveSheet.Paste

    ElseIf ActiveCell = "Insp-Operación" Then
    columna = ActiveCell.Column
    fila = ActiveCell.Row
    Cells(fila, columna - 5).Cut
    Range("JL14").Select
    ActiveSheet.Paste
    Range("F59").Select
    Selection.Copy
    Cells(fila, columna - 5).Select
    ActiveSheet.Paste

    ElseIf ActiveCell = "Desplazamiento" Then
    columna = ActiveCell.Column
    fila = ActiveCell.Row
    Cells(fila, columna - 5).Cut
    Range("JL14").Select
    ActiveSheet.Paste
    Range("F61").Select
    Selection.Copy
    Cells(fila, columna - 5).Select
    ActiveSheet.Paste

    ResponderEliminar
    Respuestas
    1. Hola,
      para borrar las imágenes que van siendo 'apartadas' puedes localizar la zona de borrado:
      For Each img In ActiveSheet.Shapes
      On Error Resume Next
      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
      img.Delete
      End If
      End if
      On Error GoTo 0
      Next

      siendo PrimeraFila, PrimeraColumna, etc los números de filas y columnas que limitan dónde se encuentran las imágenes a borrar.

      Saludos

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Muchas gracias.

      Acabado de probarlo, pero me da un error. He insertado el código después de cortar y pegar la celda con la autoforma en la zona apartada. No se si el error es que no se debe insertar ahí.

      If ActiveCell = "Valor Añadido" Then
      columna = ActiveCell.Column
      fila = ActiveCell.Row
      Cells(fila, columna - 5).Cut
      Range("JL14").Select
      ActiveSheet.Paste
      For Each img In ActiveSheet.Shapes
      On Error Resume Next
      tc = img.BottomRightCell.Column
      tr = img.BottomRightCell.Row
      If (tc >= PrimeraColumna And tc <= UltimaColumna) And _
      (tr >= PrimeraFila And tr <= UltimaFila) Then
      If img.Type = 1 Then
      img.Delete
      End If
      End If
      On Error GoTo 0
      Next
      Range("F58").Select
      Selection.Copy
      Cells(fila, columna - 5).Select
      ActiveSheet.Paste

      Sigo dando vueltas al tema y se me ocurre que si no seria mas fácil sustituir esta parte de código
      Cells(fila, columna - 5).Cut
      Range("JL14").Select
      ActiveSheet.Paste
      Que corta y pega la celda con la autoforma y la pega en una zona apartada por un código similar al que me aconsejas pero que únicamente elimine la autoforma del interior de la celda sobre la que estoy trabajando en ese momento (Cells(fila,columna-5)) y así ahorrar pasos de codigo al no tener que pegarla en la zona apartada para luego borrarla

      Muchisimas gracias

      Eliminar
    4. esa es la idea Luis..
      no tener que cortar, si no con el código comentado eliminarlas las imágenes del rango en que trabajes, delimitando las variables (primeracolumna, ultimacolumnas, etc) con los datos de la celda en que se encuentre dicha autoforma...

      Slds

      Eliminar
  14. Hola Ismael, He utilizado tu código para borrar imágenes, pero le he añadido para que borre también cuadro de texto en el mismo rango, el cual funciona, y es como sigue:

    Sub borrarImagenesCuadrotexto()
    Dim img As Shape
    On Error Resume Next

    For Each img In ActiveSheet.Shapes
    If Not Application.Intersect(img.TopLeftCell, Range("B6:L25")) Is Nothing Then
    If img.Type = msoPicture Then img.Delete
    If img.Type = msoTextBox Then img.Delete
    End If
    Next
    End Sub

    Mi consulta es, si hay un código más corto para este procedimiento, y quisiera crear una macro con las mismas características, pero que además se borren las imágenes y cuadros de textos en todas las hojas, o mejor por Ejm a partir de la Hoja2, ya que tengo más de 40 hojas donde quiero eliminar las imágenes y cuadros de textos en el mismo rango

    Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola Erick,
      más corto podría ser en lugar de:
      If img.Type = msoPicture Then img.Delete
      If img.Type = msoTextBox Then img.Delete

      poner
      If img.Type = msoPicture or img.Type = msoTextBox Then img.Delete

      Para recorrer las 40 hojas, puedes hacer un loop por las Sheets
      FOR EACH sh IN Worksheets
      IF sh.Name<>"Hoja1" THEN
      sh.select
      For Each img In ActiveSheet.Shapes
      If Not Application.Intersect(img.TopLeftCell, Range("B6:L25")) Is Nothing Then
      If img.Type = msoPicture or img.Type = msoTextBox Then img.Delete
      End If
      Next
      End Sub

      END IF
      NEXT sh

      Debería funcionar bien...
      Saludos

      Eliminar
  15. Gracias Ismael
    Acabado de probarlo, pero me da un error. He insertado en un módulo el código:
    Sub borrarImagenesCuadrotexto()
    Dim img As Shape
    On Error Resume Next

    FOR EACH sh IN Worksheets
    IF sh.Name<>"Hoja1" THEN
    sh.select
    For Each img In ActiveSheet.Shapes
    If Not Application.Intersect(img.TopLeftCell, Range("B6:L25")) Is Nothing Then
    If img.Type = msoPicture or img.Type = msoTextBox Then img.Delete
    End If
    Next
    End Sub

    END IF
    NEXT sh

    Y me sale:
    Error de compilación:
    Bloque If sin End If

    Lo que he hecho es cambiar el orden del código y he movido el "End Sub" al final del código, y me ha funcionado, no sé si es por eso que no corría, y si es esta la solución, pero mi problema es que ha borrado todas las imágenes desde la Hoja1, y debería ser a partir de la “Hoja6”.

    Modifique en el código la "Hoja1" por la "Hoja6", pero igual se borran las imágenes en todas las Hojas, No sé si se puede modificar para que las imágenes se eliminen a partir de la "Hoja6" en adelante, siempre en el mismo rango.

    Además quisiera saber si las imágenes borradas las esta moviendo algún sitio o las está eliminando

    Gracias nuevamente

    ResponderEliminar
    Respuestas
    1. Hola Erick,
      correcto respecto al End Sub, fue un error de pegado...
      respecto al borrado de imágenes no hay movimiento de ellas, y sí eliminación, fíjate en la propiedad .Delete que estás usando.

      En cuanto a las hojas, lo que se hace es un Bucle que recorre TODAS las hojas.. en el ejemplo, comentabas que querías borrar las imágenes de todas las hojas a partir de la Hoja2 (es decir, menos la Hoja1) de ahí la solución..
      Con el código empleado podrías incorporar a tu sentencia de control:
      IF sh.Name<>"Hoja1" or sh.Name<>"Hoja2" or sh.Name<>"Hoja3" THEN
      ...
      para evitar las hojas que no te interese borrar imágenes....
      O bien optar por otro loop del tipo
      For sh=6 to 40
      Worksheets(sh).select
      ....

      OJO!, la numeración podría no coincidir con el orden visible de tus hojas....

      Saludos

      Eliminar
  16. Gracias Ismael
    He realizado la inserción correspondiente, insertado en un módulo el código:

    Sub borrarImagenesCuadrotexto()
    Dim img As Shape
    On Error Resume Next

    For Each sh In Worksheets
    IF sh.Name<>"Hoja1" or sh.Name<>"Hoja2" or sh.Name<>"Hoja3" or sh.Name<>"Hoja4" or sh.Name<>"Hoja5" THEN
    sh.Select
    For Each img In ActiveSheet.Shapes
    If Not Application.Intersect(img.TopLeftCell, Range("B6:L25")) Is Nothing Then
    If img.Type = msoPicture Or img.Type = msoTextBox Then img.Delete
    End If
    Next

    End If
    Next sh
    End Sub

    Continúa igual el problema, porque borra las imágenes en el rango de todas las hojas, incluyendo la “Hoja1”, y con esta inserción no debería haber borrado las imágenes de la “Hoja1” a la “Hoja5”, no sé, si he cometido algún error en la estructura del código.

    Gracias nuevamente
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Erick,
      1-asegúrate que los nombres de las hojas son esos (Hoja1, Hoja2,..)
      2-Prueba cambiando el 'OR' por 'AND':
      IF sh.Name<>"Hoja1" AND sh.Name<>"Hoja2" AND sh.Name<>"Hoja3" AND sh.Name<>"Hoja4" AND sh.Name<>"Hoja5" THEN
      3-También te propuse una segunda alternativa:
      For sh=6 to 40
      Worksheets(sh).select
      ....

      Saludos cordiales

      Eliminar
  17. Gracias Ismael
    He reemplazado el “Or” por el “And”

    IF sh.Name<>"Hoja1" And sh.Name<>"Hoja2" And sh.Name<>"Hoja3" And sh.Name<>"Hoja4" And sh.Name<>"Hoja5" Then
    …..
    Con este reemplazo, tampoco funciona, continua borrando todas las imagines de todas las Hojas

    He probado realizando el cambio de la designación de las “Hoja1”,”Hoja2” ………., por sus verdaderos nombres y solo así se borran las imágenes de las hojas que deseo (Ejm: “Calendario” , “Listas”…..) empleando “And” , con “Or” no funciona; mi consulta es porque no responde al colocar con la “Hoja1”, “Hoja2” ……. y sí, colocando los nombres verdaderos de las hojas, me parece un caso curioso, ¿ Es esto es así?, ¿Cómo debería ser? Me parece que debería ser colocando “Hoja1”, Hoja2”…. Por si acaso yo tengo Excel 2010

    Por otro lado empleando el otro loop recomendado:
    For sh=6 to 40
    Worksheets(sh).select

    Para que funcione, ‘He tenido que designar las hojas, de acuerdo al orden como las visualizo en pantalla (contando), No como esta designadas las hojas en la Ficha Programador VB;

    Por lo tanto: For sh=10 to 40 (De esta manera funciona). Para que coincida con lo que quiero borrar.

    Por otra parte quise modificar las hojas donde se borraran las imágenes en estos rangos:
    For sh=10 to 24 or Sh=31 to 40 y no funciona (quería borrar en estos dos grupos, empleando este loop), se podría borrar las imágenes en estos dos grupos empleando este Loop (For sh). ¿Cómo seria?

    Gracias nuevamente por tu gran apoyo.
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Erick,
      cada hoja tiene dos nombres, un CodeName y un Name (el nombre que vemos en las etiquetas de las hojas)... si estamos empleando la propiedad .Name es lógico que empleemos esos nombres.

      En cuanto al segundo loop FOR x=6 to 40 ya te comentaba que debían estar ordenadas...
      Para partir el loop deberá hacer dos loop diferentes.
      Saludos

      Eliminar
  18. Buenas tardes,
    existe la posibilidad de identificar las imágenes que están enmarcadas dentro de una celda?? Yo hago coincidir las imagenes dentro de la celda y me gustaría poder eliminar las que estuvieran enmarcadas en una cleda específica.

    ResponderEliminar
    Respuestas
    1. Hola,
      podrías identificarlas por su posición en esas celdas...
      las imágenes tienen una propiedad .TopLeftCell y .bottomRightCell que identifican su posición
      Echa un vistazo a este post:
      http://excelforo.blogspot.com.es/2015/03/vba-borrar-imagenes-de-un-rango.html

      Saludos

      Eliminar
  19. Buenas. Antes de todo gracias. Yo quiero borrar unas imágenes que he insertado en un ppt existente con una macro. Cómo lo hago? Sería ir a una diapositiva concreta y borrar la imagen. Así con varias diapositivas. Gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      la programación sería similar, pero no igual.. ya que al necesitar actuar sobre objetos/imágenes de una diapositiva dentro de un a presentación tendrás que emplear las propiedades correspondientes...
      A modo de ejemplo de notación echa un vistazo a
      http://excelforo.blogspot.com.es/2011/04/macro-para-copiar-y-pegar-un-rango-de.html
      Saludos

      Eliminar
  20. Hola.
    Ayuda: Y si quiero eliminar más de una imagen, pero no todas, como dos o diez.
    Mi problemas es que quiero que macros solo borre la o las últimas imágenes anteriores que por defecto
    se acumulan una detrás de otra al ejecutar varias macros con imágenes, y que deje intacta la
    imagen de la última macro que ejecuté.
    Gracias de antemano.

    ResponderEliminar
    Respuestas
    1. Hola Sara,
      la cuestión es cómo identificas esas 'últimas imágenes', qué las hace diferentes al resto...
      En principio todas las imágenes son iguales, cambiando el nombre de estas, así que si eres capaz de identificar el nombre las que no quieres borrar, podrás realizar un borrado de todas ellas excepto de esas en concreto.
      No parece fácil en principio... quizá añadiendo al nombre de la imagen una secuencia temporal que luego se recuperará para saber cuál ha sido añadida en último lugar.
      Saludos

      Eliminar