🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Delete Sheet dans Excel — supprimer une feuille sans l'invite ni le blocage

|

VBA Delete Sheet dans Excel — supprimer une feuille sans l'invite ni le blocage

TL;DRWorksheet.Delete est la seule opération sur les feuilles qui interrompt pour demander. Elle lance une confirmation modale — celle qui dit que des données peuvent exister — et dans une macro sans surveillance ou une boucle, cette boîte de dialogue est un blocage, pas un filet de sécurité. Faites-la taire avec Application.DisplayAlerts = False, et réactivez-la dans un gestionnaire d'erreurs pour qu'un plantage ne laisse jamais les alertes coupées pour toute la session. Deux limites strictes en découlent : Excel refuse de supprimer la dernière feuille visible (erreur 1004), et supprimer par index dans une boucle saute des feuilles à moins de boucler à l'envers.

Sub DeleteSheetSafely(nm As String)
    Dim ws As Worksheet
    On Error GoTo Done
    Application.DisplayAlerts = False
    For Each ws In ThisWorkbook.Worksheets
        If StrComp(ws.Name, nm, vbTextCompare) = 0 Then ws.Delete
    Next ws
Done:
    Application.DisplayAlerts = True      ' retabli meme si Delete a leve une erreur
End Sub

Worksheet.Delete est le code derrière clic droit sur un onglet ▸ Supprimer. C'est ainsi qu'une macro démolit les feuilles de brouillon ou les onglets de travail du mois dernier avant une nouvelle exécution. Contrairement à Add et Copy, qui font leur travail en silence, Delete s'arrête et attend un humain — et cette pause est la racine de presque tous les problèmes de suppression de feuille.

Ce que vous allez apprendre

  • Le modèle mental — Delete est irréversible et demande d'abord, et c'est la question qui bloque votre macro
  • La règle qui compte le plus — faites taire l'invite, puis rétablissez-la dans un gestionnaire d'erreurs
  • Pourquoi Excel refuse de supprimer la dernière feuille visible
  • Pourquoi supprimer dans une boucle saute des feuilles, et comment boucler à l'envers corrige cela
  • Comment supprimer une feuille seulement si elle existe

Le modèle mental : Delete demande d'abord, et il n'y a pas d'annulation

Deux faits sur Delete expliquent le reste. D'abord, il est permanent — il n'y a pas d'annulation pour une feuille supprimée, donc les données et tout ce qui se trouve sur l'onglet disparaissent à l'instant où l'appel réussit. Ensuite, précisément parce qu'il est permanent, Excel le garde derrière une boîte de dialogue de confirmation modale : « Data may exist in the sheet(s) selected for deletion. To permanently delete the data, press Delete. »

Dans une session interactive, cette boîte de dialogue est une ceinture de sécurité bienvenue. En automatisation, c'est l'ennemie. Une macro qui supprime dix feuilles de brouillon lance cette invite dix fois, et si la macro tourne sans surveillance — la nuit, sur un serveur, depuis une tâche planifiée — elle se fige tout simplement, en attendant un clic qui ne viendra jamais. Tout l'art de supprimer des feuilles en VBA consiste à désactiver cette question en toute sécurité.

La règle qui compte le plus : faire taire l'invite, puis la rétablir

Supprimez la confirmation avec Application.DisplayAlerts = False, et — c'est la moitié importante — réactivez-la dans un gestionnaire d'erreurs. Laisser les alertes coupées n'est pas une commodité locale : c'est un réglage global qui reste coupé pour le reste de la session Excel, faisant taire toutes les confirmations, y compris l'invite « voulez-vous écraser ce fichier ? ». Si votre macro meurt entre le moment où vous coupez les alertes et celui où vous les rétablissez, vous avez discrètement désarmé toute l'application.

Sub ClearScratchSheets()
    On Error GoTo Done
    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets("Scratch").Delete
Done:
    Application.DisplayAlerts = True      ' s'execute toujours, meme en cas d'erreur
End Sub

C'est la même discipline que vous employez avec ScreenUpdating et autour d'Unprotect : tout réglage global que vous coupez est rétabli à une étiquette de sortie unique, pour qu'un plantage ne puisse pas laisser la session dans un état dangereux. Si vous ne devez retenir qu'une seule chose sur la suppression de feuilles, que ce soit « rétablir DisplayAlerts dans un gestionnaire ».

Excel refuse de supprimer la dernière feuille visible

Un classeur doit toujours contenir au moins une feuille visible : Delete sur la dernière feuille visible déclenche donc l'erreur d'exécution 1004 — même avec les alertes supprimées. Cela mord dès l'instant où vous écrivez « supprime toute feuille qui correspond à X » et que X se trouve les correspondre toutes, ou « supprime toutes les feuilles sauf le rapport » quand le rapport n'est pas là où vous le pensiez.

Protégez ce plancher explicitement avant de supprimer :

If ThisWorkbook.Worksheets.Count > 1 Then
    ws.Delete
Else
    MsgBox "Cannot delete the only remaining sheet."
End If

Notez que les feuilles masquées ne comptent pas dans l'exigence « au moins une visible » : un classeur avec une feuille visible et plusieurs masquées refuse donc encore de supprimer la visible. Si vous devez la retirer, réaffichez d'abord une autre feuille.

Pourquoi supprimer dans une boucle saute des feuilles

Voici le piège qui transforme « supprime ces cinq feuilles » en « supprime-en deux, saute-en trois, puis erreur ». Quand vous parcourez la collection par index et que vous supprimez au fil de l'eau, chaque suppression décale d'un cran vers le bas les index suivants — si bien que Sheets(i) après une suppression pointe sur ce qui était Sheets(i+1), et votre For i = 1 To Count passe droit devant :

' FAUX - la suppression decale les index, des feuilles sont sautees
For i = 1 To ThisWorkbook.Worksheets.Count
    ThisWorkbook.Worksheets(i).Delete       ' i pointe maintenant au-dela de la feuille suivante
Next i

Deux corrections propres. Bouclez à l'envers, pour que le décalage ne survienne que dans la partie déjà parcourue — la même raison qui fait supprimer les lignes de bas en haut (voir VBA Delete Rows) :

For i = ThisWorkbook.Worksheets.Count To 1 Step -1
    With ThisWorkbook.Worksheets(i)
        If .Name Like "Temp*" Then .Delete
    End With
Next i

Ou utilisez For Each, qui est sûr ici parce qu'il itère sur les objets plutôt que sur des positions d'index fixes — c'est la forme qu'emploie l'extrait du TL;DR. Dans tous les cas, ne supprimez jamais en faisant avancer un index.

Comment ExcelMaster vous aide

Supprimer une feuille paraît trivial et cache quatre façons d'échouer : une invite modale qui bloque une exécution sans surveillance, un DisplayAlerts global laissé coupé après un plantage, l'erreur 1004 sur la dernière feuille visible, et une boucle vers l'avant qui saute la moitié de ses cibles.

ExcelMaster vous laisse dire ce que vous voulez retirer — « supprime toute feuille dont le nom commence par Temp, mais jamais la dernière » — et il écrit la version sûre : DisplayAlerts coupé avec un rétablissement garanti dans un gestionnaire d'erreurs, un garde-compteur pour le plancher de la dernière feuille visible, et une boucle à l'envers ou un For Each pour que rien ne soit sauté. Il vous rappelle aussi que la suppression est permanente, et propose d'effacer plutôt le contenu d'une feuille quand vous voulez quelque chose de réversible. Vous gardez le classeur et le code.

Questions fréquentes

Comment supprimer une feuille en VBA sans l'invite de confirmation ?

Mettez Application.DisplayAlerts = False avant la suppression, puis rétablissez-le avec Application.DisplayAlerts = True ensuite — idéalement à une étiquette de gestionnaire d'erreurs, pour qu'il s'exécute même si la suppression échoue. Avec les alertes supprimées, ThisWorkbook.Worksheets("Scratch").Delete retire la feuille en silence.

Pourquoi ma macro se fige-t-elle en supprimant une feuille ?

Parce que Delete lance une boîte de dialogue de confirmation modale et que la macro attend un clic qui ne vient jamais — fréquent dans les exécutions sans surveillance ou planifiées. Supprimez la boîte de dialogue avec Application.DisplayAlerts = False autour de la suppression. Pensez à le réactiver, sinon il reste coupé pour toute la session Excel.

Pourquoi ai-je l'erreur 1004 en supprimant une feuille de calcul ?

En général parce que c'est la dernière feuille visible, et qu'un classeur doit garder au moins une feuille visible. Vérifiez ThisWorkbook.Worksheets.Count > 1 avant de supprimer, ou réaffichez d'abord une autre feuille. Notez que l'erreur 1004 est ici distincte de l'invite de confirmation — supprimer DisplayAlerts ne lève pas le plancher de la dernière feuille.

Comment supprimer une feuille seulement si elle existe ?

Il n'y a pas de méthode Exists : parcourez donc la collection Worksheets et comparez les noms avec StrComp(ws.Name, nm, vbTextCompare) = 0, en supprimant en cas de correspondance. Cela ne fait rien, avec élégance, quand la feuille est absente, au lieu de déclencher une erreur comme le ferait un Worksheets("Gone").Delete direct.

Comment supprimer plusieurs feuilles dans une boucle ?

Bouclez à l'envers par index — For i = Worksheets.Count To 1 Step -1 — ou utilisez For Each, car supprimer en faisant avancer un index décale les index suivants et saute des feuilles. Supprimez DisplayAlerts pour le lot et protégez le compte de la dernière feuille visible pour que la suppression finale ne déclenche pas 1004.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 14/09/2026.

Guides associés : VBA Add Sheet · VBA Copy Sheet · VBA DisplayAlerts · VBA Delete Rows · VBA Gestion des erreurs