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).
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
- Ouvrir l’éditeur VBA : Alt + F11.
- Insérer un module : Insertion > Module.
- Coller le code puis fermer l’éditeur.
- 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 courants | Notes |
---|---|---|
msoPicture , msoLinkedPicture | Images collées, captures, Appareil photo | Souvent les plus nombreux dans les dashboards. |
msoTextBox | Zones de texte | Inclut les légendes textuelles flottantes. |
msoAutoShape , msoLine | Flèches, rectangles, connecteurs | Toutes les formes de base du ruban Insertion > Formes. |
msoChart | Graphiques incorporés | Peut être exclu pour ne pas détruire vos visuels. |
msoFormControl , msoOLEControlObject | Boutons, cases à cocher, listes déroulantes | Souvent liés à des macros ; prudence avant suppression. |
SmartArt (forme spéciale) | Organigrammes SmartArt | Exposé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 lesAreas
; 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 passezCalculation
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)
- Ouvrez votre classeur et appuyez sur Alt + F11.
- Menu Insertion > Module, puis collez la macro souhaitée (simple, sécurisée ou chevauchement).
- Revenez dans Excel, sélectionnez la plage à nettoyer.
- 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_" & 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 queDelete1
. - 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) <> "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 <> 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 <= aL Or aL + aW <= sL Or sT + sH <= aT Or aT + aH <= 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 ».