Excel VBA : supprimer toutes les formes dans une plage sélectionnée (images, zones de texte, SmartArt)

Besoin d’effacer d’un coup toutes les formes (images, zones de texte, SmartArt…) qui se trouvent dans votre sélection Excel ? Voici une macro‑VBA prête à l’emploi, robuste, avec variantes (ciblage par type, gestion des chevauchements, optimisation des performances).

Sommaire

Supprimer toutes les formes d’une plage sélectionnée dans Excel

Vue d’ensemble de la question

Vous souhaitez une macro‑VBA capable de supprimer automatiquement toutes les formes — objets dessinés, images, zones de texte, SmartArt, formes libres, boutons de formulaire, etc. — se trouvant à l’intérieur de la plage actuellement sélectionnée sur la feuille active. L’objectif : nettoyer rapidement une zone d’un tableau ou d’un rapport sans devoir chasser manuellement chaque élément graphique.

Réponse & Solution (version simple)

La procédure ci‑dessous parcourt toutes les formes de la feuille et supprime celles dont le coin supérieur gauche est ancré dans la sélection.

Sub SupprimerFormesDansSelection()
    Dim shp As Shape, rng As Range, ws As Worksheet
    Set ws  = ActiveSheet
    Set rng = Selection                       ' plage ciblée par l’utilisateur

    ' Parcours de toutes les formes de la feuille
    For Each shp In ws.Shapes
        ' Vérifie si le coin supérieur gauche de la forme tombe dans la plage
        If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then
            shp.Delete                        ' supprime la forme
        End If
    Next shp
End Sub
  1. Ouvrir l’éditeur VBA : Alt + F11.
  2. Insérer un module : Insertion > Module.
  3. Coller le code puis fermer l’éditeur.
  4. Exécuter : Alt + F8, choisir SupprimerFormesDansSelection, puis Exécuter.

Pourquoi cette méthode fonctionne

Chaque forme Excel possède des informations d’ancrage : la cellule en haut‑gauche (TopLeftCell) et celle en bas‑droite (BottomRightCell). Tester l’intersection entre ces cellules d’ancrage et la sélection est très fiable pour les besoins courants, notamment lorsque vos formes sont « attachées » aux cellules (placements Déplacer et dimensionner avec les cellules ou Déplacer mais ne pas dimensionner).

Toutefois, si une forme recouvre visuellement la sélection sans que son ancre en haut‑gauche soit dedans, la version simple ne la supprimera pas. C’est précisément ce que résolvent les variantes ci‑dessous.

Variantes robustes et personnalisables

Version renforcée (suppression sûre, boucle inverse, contrôles & performances)

Cette version gère davantage de cas réels : elle vérifie que la sélection est bien une Range, respecte les feuilles protégées, accélère l’exécution (désactivation temporaire du recalcul et de l’affichage), et boucle à rebours pour éviter tout conflit lorsque la collection Shapes change pendant la suppression.

Sub SupprimerFormesDansSelection_Securisee()
    Dim ws As Worksheet, rng As Range, i As Long
    Dim scr As Boolean, calc As XlCalculation, evt As Boolean

    On Error GoTo CleanFail
    Set ws = ActiveSheet

    If TypeName(Selection) <> "Range" Then
        MsgBox "Veuillez d'abord sélectionner une plage de cellules.", vbExclamation
        Exit Sub
    End If
    Set rng = Selection

    If ws.ProtectContents Then
        MsgBox "La feuille est protégée. Impossible de supprimer les formes.", vbExclamation
        Exit Sub
    End If

    ' Optimisations
    scr = Application.ScreenUpdating: Application.ScreenUpdating = False
    calc = Application.Calculation:   Application.Calculation = xlCalculationManual
    evt = Application.EnableEvents:   Application.EnableEvents = False

    ' Boucle de l'arrière vers l'avant
    For i = ws.Shapes.Count To 1 Step -1
        With ws.Shapes(i)
            If Not Intersect(.TopLeftCell, rng) Is Nothing Then
                .Delete
            End If
        End With
    Next i

CleanExit:
    Application.ScreenUpdating = scr
    Application.Calculation = calc
    Application.EnableEvents = evt
    Exit Sub

CleanFail:
    MsgBox "Une erreur est survenue : " & Err.Description, vbExclamation
    Resume CleanExit
End Sub

Version « chevauchement visuel » (pas seulement l’ancre haut‑gauche)

Ici, on supprime toute forme qui recoupe géométriquement la (ou les) zone(s) sélectionnée(s), même si l’ancre est à l’extérieur. La macro gère les sélections multiples via rng.Areas.

Private Function RectsSeChevauchent(ax As Double, ay As Double, aw As Double, ah As Double, _
                                    bx As Double, by As Double, bw As Double, bh As Double) As Boolean
    RectsSeChevauchent = Not (ax + aw <= bx Or bx + bw <= ax Or _
                              ay + ah <= by Or by + bh <= ay)
End Function

Sub SupprimerFormesChevauchantes()
    Dim ws As Worksheet, rng As Range, ar As Range
    Dim i As Long, sLeft As Double, sTop As Double, sW As Double, sH As Double
    Dim aLeft As Double, aTop As Double, aW As Double, aH As Double
    Dim scr As Boolean

    If TypeName(Selection) <> "Range" Then
        MsgBox "Sélectionnez une plage.", vbExclamation: Exit Sub
    End If
    Set ws = ActiveSheet
    Set rng = Selection

    scr = Application.ScreenUpdating: Application.ScreenUpdating = False

    ' Pour chaque forme de la feuille
    For i = ws.Shapes.Count To 1 Step -1
        With ws.Shapes(i)
            sLeft = .Left: sTop = .Top: sW = .Width: sH = .Height
        End With

        ' Vérifie contre chaque zone de la sélection
        For Each ar In rng.Areas
            aLeft = ar.Left: aTop = ar.Top: aW = ar.Width: aH = ar.Height
            If RectsSeChevauchent(sLeft, sTop, sW, sH, aLeft, aTop, aW, aH) Then
                ws.Shapes(i).Delete
                Exit For
            End If
        Next ar
    Next i

    Application.ScreenUpdating = scr
End Sub

Remarque : l’approche géométrique est la plus exhaustive, notamment pour des objets flottants. Elle fonctionne aussi avec des plages non contiguës.

Limiter la suppression à certains types (ex. uniquement les images)

Vous pouvez filtrer par Shape.Type pour cibler précisément vos suppressions (images, zones de texte, formes automatiques, etc.).

Sub SupprimerUniquementImagesDansSelection()
    Dim ws As Worksheet, rng As Range, i As Long, t As MsoShapeType

    If TypeName(Selection) <> "Range" Then
        MsgBox "Sélectionnez une plage.", vbExclamation: Exit Sub
    End If
    Set ws = ActiveSheet
    Set rng = Selection

    For i = ws.Shapes.Count To 1 Step -1
        With ws.Shapes(i)
            t = .Type
            If (t = msoPicture Or t = msoLinkedPicture) Then
                If Not Intersect(.TopLeftCell, rng) Is Nothing Then .Delete
            End If
        End With
    Next i
End Sub

Pour ne supprimer que les zones de texte, adaptez le test : t = msoTextBox. Pour les formes automatiques : t = msoAutoShape Or t = msoLine, etc. Vous pouvez aussi exclure certains types (ex. les graphiques msoChart, les contrôles de formulaire msoFormControl, les contrôles ActiveX msoOLEControlObject).

Ne supprimer que ce qui est entièrement dans la sélection

Utilisez les deux ancres (TopLeftCell et BottomRightCell) pour exiger que la forme soit complètement contenue dans la plage :

Sub SupprimerFormesEntierementDansSelection()
    Dim ws As Worksheet, rng As Range, i As Long
    If TypeName(Selection) <> "Range" Then
        MsgBox "Sélectionnez une plage.", vbExclamation: Exit Sub
    End If
    Set ws = ActiveSheet
    Set rng = Selection

    For i = ws.Shapes.Count To 1 Step -1
        With ws.Shapes(i)
            If Not Intersect(.TopLeftCell, rng) Is Nothing _
               And Not Intersect(.BottomRightCell, rng) Is Nothing Then
                .Delete
            End If
        End With
    Next i
End Sub

Cas particuliers & bonnes pratiques

Feuilles protégées, dossier partagé, droits

  • Si la feuille est protégée (ws.ProtectContents = True), la suppression échoue : ôtez la protection ou autorisez la suppression d’objets.
  • Sur des classeurs partagés/OneDrive, vérifiez qu’aucune co‑édition n’empêche les modifications sur les objets de dessin.

Objets à connaître

Les principaux objets que vous rencontrerez dans ws.Shapes :

Type (VBA)Exemples courantsNotes
msoPicture, msoLinkedPictureImages collées, captures, Appareil photoSouvent les plus nombreux dans les dashboards.
msoTextBoxZones de texteInclut les légendes textuelles flottantes.
msoAutoShape, msoLineFlèches, rectangles, connecteursToutes les formes de base du ruban Insertion > Formes.
msoChartGraphiques incorporésPeut être exclu pour ne pas détruire vos visuels.
msoFormControl, msoOLEControlObjectBoutons, cases à cocher, listes déroulantesSouvent liés à des macros ; prudence avant suppression.
SmartArt (forme spéciale)Organigrammes SmartArtExposés via Shapes et donc éligibles à la suppression.

Objets à l’intérieur des graphiques

Si vous ajoutez des formes dans un graphique (par exemple un label personnalisé), elles appartiennent à Chart.Shapes et non à ws.Shapes. Pour les traiter, parcourez les ChartObjects puis leurs Shapes.

Sub SupprimerFormesDansGraphiques_SiChevauchentSelection()
    Dim co As ChartObject, s As Shape
    Dim rng As Range
    If TypeName(Selection) <> "Range" Then Exit Sub
    Set rng = Selection

    For Each co In ActiveSheet.ChartObjects
        For Each s In co.Chart.Shapes
            ' Ici, on teste l'emprise du ChartObject (pas l'intérieur du graphique)
            If Not Intersect(co.TopLeftCell, rng) Is Nothing Then
                s.Delete
            End If
        Next s
    Next co
End Sub

Astuce : si vous préférez cibler uniquement les formes superposées au plot area, calculez les coordonnées relatives au graphique, ou combinez avec la variante « chevauchement visuel » adaptée à Chart.

Plages non contiguës & cellules fusionnées

  • Plages multiples : Intersect gère les Areas ; la version géométrique boucle sur chacune.
  • Cellules fusionnées : l’ancre haut‑gauche d’une forme dans une zone fusionnée correspond à la première cellule de cette zone ; le test reste valide.

Performance sur des feuilles lourdes

  • Désactivez temporairement ScreenUpdating, EnableEvents et passez Calculation en manuel.
  • Évitez For Each pendant la suppression : préférez une boucle à rebours (For i = Count To 1 Step -1).
  • Si vous devez supprimer dans plusieurs feuilles, traitez‑les séparément pour conserver une bonne réactivité de l’interface.

Prévisualiser avant d’effacer (sélection sans suppression)

Pour rassurer l’utilisateur, vous pouvez surligner les formes qui seraient supprimées, sans les supprimer immédiatement :

Sub PrevisualiserFormesDansSelection()
    Dim ws As Worksheet, rng As Range, shp As Shape
    If TypeName(Selection) <> "Range" Then Exit Sub
    Set ws = ActiveSheet: Set rng = Selection
    For Each shp In ws.Shapes
        If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then
            shp.Select Replace:=False  ' ajoute la forme à la sélection
            ' Optionnel : épaissir le contour pour voir l’emprise
            On Error Resume Next
            shp.Line.Weight = 2
            On Error GoTo 0
        End If
    Next shp
End Sub

Ensuite, lancez la macro de suppression « sécurisée » si l’aperçu correspond à vos attentes.

Annulation & sécurité des données

  • Les suppressions réalisées par VBA ne sont pas annulables via Ctrl+Z. Sauvegardez le classeur, ou travaillez sur une copie.
  • En environnement critique, dupliquez temporairement la feuille (clic droit > Déplacer/Copier > Créer une copie) avant la suppression.

Scénarios concrets

Nettoyer une zone d’impression

Avant d’exporter en PDF, il est fréquent de masquer/retirer des pictogrammes et annotations. Sélectionnez la zone d’impression, exécutez la macro : seules les formes dans cette zone disparaissent, vos éléments hors page restent intacts.

Préparer un modèle (template) réutilisable

Intégrez la macro dans le PERSONAL.XLSB pour l’avoir partout (Alt+F8 > Options > associez un raccourci). Ajoutez une bannière « Nettoyer la sélection » dans l’onglet Développeur via un bouton de formulaire relié à la macro.

Protéger certains objets

Si vous souhaitez épargner certains objets (ex. un logo), nommez‑les (sélectionnez la forme > zone de nom > saisissez LogoSociete) et excluez‑les :

If .Name <> "LogoSociete" Then .Delete

Pour plusieurs noms, employez une collection ou un test de préfixe (Left(.Name, 5) <> "KEEP_").

Guide « pas à pas » (installation et usage)

  1. Ouvrez votre classeur et appuyez sur Alt + F11.
  2. Menu Insertion > Module, puis collez la macro souhaitée (simple, sécurisée ou chevauchement).
  3. Revenez dans Excel, sélectionnez la plage à nettoyer.
  4. Alt + F8, exécutez la macro choisie.

Dépannage (FAQ)

« Certaines images ne disparaissent pas »

Si leurs ancres sont hors sélection mais qu’elles débordent visuellement dans la plage, utilisez la version « chevauchement visuel ». Vérifiez également que la feuille n’est pas protégée et que l’objet n’est pas dans un Chart (cas des éléments ajoutés au graphique).

« Je veux préserver mes graphiques et mes contrôles »

Filtrez par types : excluez msoChart, msoFormControl et msoOLEControlObject. Exemple :

If Not (t = msoChart Or t = msoFormControl Or t = msoOLEControlObject) Then .Delete

« La sélection est une cellule unique ; est‑ce pertinent ? »

Oui. La macro efface les formes dont l’ancre est dans cette cellule. Pratique pour supprimer rapidement une icône ou un pictogramme collé sur une case.

« Mac vs Windows »

Les propriétés Left, Top, Width, Height, TopLeftCell et BottomRightCell se comportent de la même façon. Les optimisations (ScreenUpdating, Calculation, EnableEvents) sont également disponibles sur Mac.

Exemple : générer des formes de test

Utilisez cette petite routine pour créer des formes factices, puis essayez les différentes variantes de suppression.

Sub GenererFormesDeTest()
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim c As Range
    ' Images (simulate via rectangles)
    For Each c In Range("B3:D6")
        With ws.Shapes.AddShape(msoShapeRectangle, c.Left + 2, c.Top + 2, c.Width - 4, c.Height - 4)
            .Fill.Transparency = 0.35
            .Line.DashStyle = msoLineDash
            .Name = "Test_Rect_" &amp; c.Address(False, False)
        End With
    Next c
    ' Zone de texte
    With ws.Shapes.AddTextbox(msoTextOrientationHorizontal, Range("F4").Left, Range("F4").Top, 120, 30)
        .TextFrame.Characters.Text = "Texte à supprimer"
    End With
    ' Forme qui déborde sur la zone (pour tester le chevauchement)
    With ws.Shapes.AddShape(msoShapeOval, Range("C2").Left - 20, Range("C2").Top - 10, 140, 60)
        .Fill.Transparency = 0.4
        .Name = "Debordement"
    End With
End Sub

Bonnes pratiques SEO et lisibilité (pour vos propres macros)

  • Documentez chaque procédure avec un en‑tête clair : objectif, paramètres, effets de bord (annulation impossible, protection, etc.).
  • Préférez des noms explicites : SupprimerFormesChevauchantes plutôt que Delete1.
  • Regroupez les constantes de types de formes ciblées dans une fonction dédiée (facile à maintenir).
  • Créez une version « prévisualisation » pour réduire les erreurs et inspirer confiance.

Récapitulatif rapide

  • Besoin courant : supprimer toutes les formes dans la sélection → macro simple ou sécurisée.
  • Chevauchements visuels : utilisez la version géométrique qui teste l’emprise réelle.
  • Filtrage : limitez par types (images, zones de texte, etc.) ou excluez graphiques/contrôles.
  • Performance & sécurité : boucle à rebours, écran figé, sauvegarde préalable.

Modèle final prêt à copier (sélection, options, filtrage)

Voici un modèle unique, clair et polyvalent : choisissez votre mode (Ancre vs Chevauchement) et ce que vous ciblez (Tous types vs Types filtrés).

Public Enum ModeSuppression
    ParAncre = 1
    ParChevauchement = 2
End Enum

Public Enum CibleFormes
    TousTypes = 0
    ImagesSeules = 1
    TextesSeuls = 2
End Enum

Sub NettoyerFormesDansSelection( _
        Optional ByVal Mode As ModeSuppression = ParAncre, _
        Optional ByVal Cible As CibleFormes = TousTypes)

    Dim ws As Worksheet, rng As Range, i As Long, t As MsoShapeType
    Dim scr As Boolean, calc As XlCalculation, evt As Boolean
    Dim sL As Double, sT As Double, sW As Double, sH As Double
    Dim ar As Range, aL As Double, aT As Double, aW As Double, aH As Double

    If TypeName(Selection) &lt;&gt; "Range" Then
        MsgBox "Sélectionnez une plage de cellules.", vbExclamation
        Exit Sub
    End If
    Set ws = ActiveSheet: Set rng = Selection
    If ws.ProtectContents Then
        MsgBox "Feuille protégée. Déprotégez-la pour supprimer les formes.", vbExclamation
        Exit Sub
    End If

    ' Optimisations
    scr = Application.ScreenUpdating: Application.ScreenUpdating = False
    calc = Application.Calculation:   Application.Calculation = xlCalculationManual
    evt = Application.EnableEvents:   Application.EnableEvents = False

    For i = ws.Shapes.Count To 1 Step -1
        With ws.Shapes(i)
            ' Filtrage par type
            t = .Type
            Select Case Cible
                Case ImagesSeules
                    If Not (t = msoPicture Or t = msoLinkedPicture) Then GoTo NextShape
                Case TextesSeuls
                    If t &lt;&gt; msoTextBox Then GoTo NextShape
            End Select

            If Mode = ParAncre Then
                If Not Intersect(.TopLeftCell, rng) Is Nothing Then .Delete
            Else
                ' Par chevauchement (emprise réelle)
                sL = .Left: sT = .Top: sW = .Width: sH = .Height
                For Each ar In rng.Areas
                    aL = ar.Left: aT = ar.Top: aW = ar.Width: aH = ar.Height
                    If Not (sL + sW &lt;= aL Or aL + aW &lt;= sL Or sT + sH &lt;= aT Or aT + aH &lt;= sT) Then
                        .Delete: Exit For
                    End If
                Next ar
            End If
        End With
NextShape:
    Next i

    ' Restauration
    Application.ScreenUpdating = scr
    Application.Calculation = calc
    Application.EnableEvents = evt
End Sub

Exemples d’appel :

  • NettoyerFormesDansSelection ParAncre, TousTypes : comportement le plus rapide et le plus sûr pour 90 % des cas.
  • NettoyerFormesDansSelection ParChevauchement, ImagesSeules : supprime uniquement les images qui recouvrent votre sélection.

Conclusion

Avec ces macros, vous disposez d’une boîte à outils complète pour purifier une zone de feuille : version simple efficace, variante sécurisée pour les classeurs exigeants, détection par chevauchement pour les cas tordus, et filtrage par type pour ne retirer que l’essentiel. Collez, exécutez, ajustez selon vos règles — et gagnez un temps précieux à chaque nettoyage de rapport.


Rappel important : la suppression via VBA est irréversible. Sauvegardez votre fichier avant exécution ou travaillez sur une copie, surtout si vous utilisez le mode « chevauchement ».

Sommaire