Hace unos días recibí una consulta sobre cómo se podría modificar el tamaño de todas las imágenes de una hoja o de un libro mediante una macro.
Aunque este tema ha sido muy tratado en diferentes webs y foros de internet, me ha parecido útil escribir un post acerca del tratamiento de imágenes (o mejor, de cualquier objeto de la colección shapes).
Es decir, en Excel podemos estar trabajando con una fotografía, un organigrama de SmarArt, un gráfico o un objeto Ole, etc). Todo ellos objetos que forman parte de la colección Shapes.
Siguiendo un caso práctico, imaginad que tenemos un libro con las siguientes formas (imágenes, autoformas, llamadas, objeto SmartArt):
Dicho esto, si quisiéramos eliminar todos los objetos de la primera hoja de nuestro libro, lo haríamos así:
Sub Borrar_Hoja()
Dim Shape As Excel.Shapes
'Por cada forma en la hoja 1
For Each Shapes In Sheets(1).Shapes
' Eliminamos forma
With Shapes
.Delete
End With
Next
End Sub
Si quisiéramos eliminar todas las formas (Shapes) que existen el libro, tendríamos que utilizar la macro anterior pero dentro de un bucle for – next que recorra todas las hojas del libro:
Sub Borrar_Libro()
Dim nHoja As Integer
Dim Shape As Excel.Shapes
'Contamos las hojas del libro activo
nHoja = ActiveWorkbook.Worksheets.Count
'Inicimiamos bucle.
For i = 1 To nHoja
'En cada hoja seleccionamos todas las formas
For Each Shapes In Sheets(i).Shapes
'y las borramos
With Shapes
.Delete
End With
Next
Next i
End Sub
Sin embargo, si solo queremos eliminar un tipo de forma, tendríamos que especificar en el código el tipo que deseamos eliminar. Antes de seguir, os dejo un enlace a Microsoft donde se especifica el nombre y valor de todas las formas de la colección shapes:
https://msdn.microsoft.com/en-us/library/office/ff860759.aspx
*en el caso del valor 24, como observaréis, he modificado el Name que aparece publicado en Microsoft en el enlace de Microsoft (msoIgxGraphic) por (msoSmartArt), el motivo es que he probado el nombre msoIgxGraphic en todas las versiones desde 2010 en adelante y no funciona, pero sí lo hace con msoSmartArt.
Por lo tanto, para realizar la prueba vamos a elegir un tipo determinado de forma a eliminar, tanto en la primera hoja como en todo el libro. La elección serán las fotografías, que equivalen según el cuadro anterior a msoPicture y con valor 13.
Para eliminar las fotografías de la primera hoja, usaremos el siguiente código:
Sub Borrar_Hoja_Tipo()
Dim Shape As Excel.Shapes
'Por cada forma en la hoja 1
For Each Shapes In Sheets(1).Shapes
' Eliminamos forma
With Shapes
'Si la forma es entonces la borramos
If .Type = 13 Then
.Delete
End If
End With
Next
End Sub
Y para eliminar las fotografías en todo el libro, usaremos el siguiente:
Sub Borrar_Libro_Tipo()
Dim nHoja As Integer
Dim Shape As Excel.Shapes
'Contamos las hojas del libro activo
nHoja = ActiveWorkbook.Worksheets.Count
'Inicimiamos bucle.
For i = 1 To nHoja
'En cada hoja seleccionamos/detectamos todas las formas
For Each Shapes In Sheets(i).Shapes
With Shapes
'Si la forma es entonces la borramos
If .Type = 13 Then
.Delete
End If
End With
Next
Next i
End Sub
El resultado después de aplicar la macro sería este:
Y hemos eliminado las fotografías en todo el libro.
Evidentemente, podemos utilizar las macros para cualquier otro tipo de acción sobre las formas, como por ejemplo darle formato, colores, alto, ancho, etc … Pero para este ejemplo, nos hemos limitado a eliminar (en otros post que tengo pensado ir publicando iremos trabajando otras acciones).
En el archivo adjunto os dejo las macros. Sin embargo los botones que he dejado para ejecutarlas, solo son para los casos donde determinamos el tipo de forma a eliminar. Las macros que eliminan todas las formas de la hoja y del libro, si pusiese un botón en la hoja, directamente lo eliminaría, dado que también se trata de una forma (control de formulario).
Espero que os sea de utilidad 🙂
Descarga el archivo de ejemplo pulsando en: ELIMINAR TODAS LAS IMÁGENES DE UNA HOJA O UN LIBRO EN EXCEL CON VBA
Gracias por tal aporte, estaba buscando desesperadamente este tipo de información.
Saludos!
Gracias Paolo. Saludos
muy buena el macro, gracias, pero quisiera solo borrar una forma en todo un libro (148 CuadroTexto)
Hola Klevin:
Solo tienes que modificar en la macro, en lugar de .type indicas name y el nombre de la imagen a borrar.
Por ejemplo aquí eliminamos la imagen nº 5 del excel de ejemplo
Sub Borrar_Libro_Tipo()
Dim nHoja As Integer
Dim Shape As Excel.Shapes
'Contamos las hojas del libro activo
nHoja = ActiveWorkbook.Worksheets.Count
'Inicimiamos bucle.
For i = 1 To nHoja
'En cada hoja seleccionamos/detectamos todas las formas
For Each Shapes In Sheets(i).Shapes
With Shapes
'Si la forma es entonces la borramos
If .Name = "Picture 5" Then
.Delete
End If
End With
Next
Next i
End Sub
Estoy tratando de usar el codigo y me dice «error de compilacion: Es necesaria una variable: no se puede asignar esta expresion». y me remarca Shapes de For Each Shapes In Sheet(i).Shapes. Que estoy haciendo mal alli? gracias..
Listo. era que lo estaba escribiendo en un lugar erroneo. Funciona muy bien. muchas gracias. Sabes que comentas que tienes un codigo para manipular la imagenes. pero no lo encontre, podrias colocar el link. gracias.. saludos
Hola Yean:
Comento que tengo pensado publicar un post tratando imágenes, pero todavía no lo he realizado. Cuando lo publique incluiré link.
Saludos.
Hola, ¿cómo puedo borrar, teniendo en cuenta además del tipo de Shape, el color de ésta?. He probado varios métodos, pero todos me dan error. Consigo borrar selectivamente por tipo de forma, pero no consigo borrar distinguiendo entre colores. ¡gracias!
Así:
If .Fill.ForeColor.RGB = RGB(237, 125, 49) Then
Con esto borras la imagen del solo de color anaranjado.
Saludos
Hola, excelente tu explicación y tu macro, pero al ejecutar, el programa «se tilda». Al parecer se crearon muchas «autoshapes» en una columna donde puse formulas vinculadas con celdas contiguas (es una columna de saldos). Cómo puedo solucionar eso? El síntoma principal es que el proceso de los resultados de esa columna es LENTÍSIMO. Gracias desde ya por tu ayuda!!
Tendría que ver los datos o un ejemplo y así verificar qué es lo que ocurre,
Saludos