Cómo eliminar Shapes en un rango seleccionado de Excel con VBA

¿Necesitas limpiar una zona específica de tu hoja de cálculo eliminando únicamente las formas (Shapes) que “caen” dentro del rango que acabas de seleccionar? Con una macro VBA sencilla –y 100 % personalizable– puedes lograrlo sin tocar el resto de tus elementos gráficos.

Índice

Ventajas de usar un procedimiento dirigido al rango seleccionado

En libros con decenas (o cientos) de objetos incrustados, borrar manualmente forma por forma es poco realista. Un procedimiento que se limita al área seleccionada te ofrece:

  • Precisión: solo desaparecen las formas cuyo punto de anclaje se encuentra dentro del rango.
  • Velocidad: la rutina recorre una lista interna en memoria mucho más rápido que el usuario con el teclado o el ratón.
  • Seguridad: evita eliminar logotipos, botones de navegación o gráficos que se hallan fuera del área objetivo.

Cómo sabe Excel dónde “vive” una forma

Cada objeto gráfico posee propiedades que describen su posición:

  • TopLeftCell – celda donde se inserta la esquina superior izquierda.
  • BottomRightCell – celda de la esquina inferior derecha.

Estas propiedades son clave, porque permiten evaluar intersecciones con un rango cualquiera mediante la función Intersect. Si la intersección es nula (Nothing), la forma no toca el rango; si hay intersección, ¡objetivo a eliminar!

Macro base: borrar Shapes cuya esquina superior izquierda cae dentro del rango seleccionado

Sub DeleteShapesInRange()
    Dim shp As Shape
    Dim rng As Range
    Dim ws  As Worksheet

    Set ws  = ActiveSheet   'Trabajamos en la hoja activa
    Set rng = Selection     'Rango sobre el que el usuario hizo clic

    For Each shp In ws.Shapes
        If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then
            shp.Delete
        End If
    Next shp
End Sub

Paso a paso de implementación

  1. Presiona ALT + F11 para abrir el Editor de Visual Basic.
  2. En el menú Insertar → Módulo, pega el procedimiento anterior.
  3. Cierra el editor y vuelve a Excel.
  4. Selecciona el rango que quieras limpiar y ejecuta la macro con ALT + F8, eligiendo DeleteShapesInRange.

¿Necesitas que la forma esté enteramente dentro del rango?

Sustituye la condición de borrado por la siguiente para exigir que tanto la esquina superior izquierda como la inferior derecha estén comprendidas en la selección:

If Not Intersect(shp.TopLeftCell, rng) Is Nothing And _
   Not Intersect(shp.BottomRightCell, rng) Is Nothing Then
    shp.Delete
End If

Manejo de formas agrupadas

Los GroupObjects son conjuntos de formas tratados por Excel como un único Shape. Si ejecutas la macro anterior, se eliminará todo el grupo cuando su celda superior izquierda esté dentro del rango, lo que quizá no deseas. Dispones de dos estrategias:

EstrategiaDescripción
Desagrupar temporalmenteLlama al método .Ungroup, evalúa cada sub‑shape y, al final, vuelve a agrupar si hace falta.
Recorrido recursivoCrea una función que acepte como parámetro un objeto ShapeRange, iterando internamente en sus miembros; si un miembro es a su vez grupo, la función se llama a sí misma.

Excluir tipos de objetos concretos

Puede que tu hoja combine imágenes, botones de formulario, controles ActiveX y gráficos. Para conservar ciertos elementos, añade un filtro antes de .Delete. Ejemplo: proteger imágenes (msoPicture) y gráficos (msoChart):

Dim tiposProtegidos As Variant
tiposProtegidos = Array(msoPicture, msoChart)

For Each shp In ws.Shapes
If IsError(Application.Match(shp.Type, tiposProtegidos, 0)) Then
If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then
shp.Delete
End If
End If
Next shp

Extender la macro a todas las hojas del libro

Cambia el alcance del bucle externo para recorrer each Worksheet en lugar de la hoja activa:

Sub DeleteShapesAllSheets()
    Dim wb  As Workbook
    Dim ws  As Worksheet
    Dim shp As Shape
    Dim rng As Range```
Set wb  = ThisWorkbook
Set rng = Selection

For Each ws In wb.Worksheets
    For Each shp In ws.Shapes
        If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then
            shp.Delete
        End If
    Next shp
Next ws
```
End Sub

Advertencia: esta rutina se basa en la selección actual, que solo existe en la hoja activa. Asegúrate de seleccionar tu rango en la primera hoja del libro para evitar ambigüedades.

Alternativas sin VBA

Si tu versión de Excel integra Office Scripts (Excel para la web) o Power Automate Desktop, puedes reproducir la lógica con JavaScript o con acciones de RPA. Sin embargo, ningún método nativo de la interfaz gráfica permite borrar masivamente formas con el nivel de granularidad que brinda VBA.

Buenas prácticas antes de ejecutar macros de eliminación

  • Haz una copia de seguridad de tu archivo; la acción es irreversible.
  • Protege las hojas con contraseña solo después de limpiar los objetos; de lo contrario la macro no tendrá permisos.
  • Valida el rango mediante un MsgBox o resaltándolo temporalmente con rng.Select antes de borrar.
  • Evita nombres duplicados; si recreas objetos después del borrado, asigna nombres únicos para facilitar su gestión futura.
  • Documenta el proceso en la cabecera del módulo con fecha, autor y finalidad.

Preguntas frecuentes (FAQ)

¿Por qué la macro no detecta algunas formas?

Algunos complementos insertan controles de clase OLEObject cuya propiedad TopLeftCell devuelve Nothing. En esos casos, usa la colección OLEObjects de la hoja y evalúa su propiedad TopLeftCell para un filtrado equivalente.

¿Puedo combinar la macro con eventos de la hoja?

Sí. Inserta el código en WorksheetSelectionChange para que se ejecute automáticamente cada vez que selecciones un rango, o en WorksheetBeforeRightClick si prefieres lanzarla con el botón secundario del ratón.

¿Cómo deshago la acción si me equivoco?

El modelo de objetos de Excel no soporta Undo tras una operación realizada por código. Solo podrás revertir cerrando el archivo sin guardar o recuperando una copia previa. De ahí la importancia del respaldo.

¿La macro ralentizará mi libro con muchos objetos?

Normalmente no. Aun con cientos de Shapes, el bucle interno ejecuta menos de un segundo gracias a que Excel mantiene índices de posiciones. Si tu archivo es muy grande, desactiva la actualización de pantalla (Application.ScreenUpdating = False) y el cálculo automático durante la ejecución.

Conclusiones

Controlar selectivamente las formas incrustadas dentro de un rango determinado es un reto común en dashboards y plantillas corporativas. Con las técnicas descritas –desde la macro básica hasta la gestión de exclusiones y grupos– dispones de un arsenal completo para mantener tu hoja de cálculo limpia y funcional. Recuerda siempre respaldar tu trabajo, probar en copias de muestra y comentar el código para que futuros usuarios comprendan su propósito. Con estos consejos, tu flujo de trabajo ganará en organización y profesionalidad.

Índice