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

VBA Rename Sheet dans Excel — ce qu'un renommage met à jour et ce qu'il casse en silence

|

VBA Rename Sheet dans Excel — ce qu'un renommage met à jour et ce qu'il casse en silence

TL;DR — ws.Name = "Sales 2026" renomme une feuille. La ligne est triviale ; les conséquences ne le sont pas. Un renommage est un refactoring : Excel réécrit toutes les références qu'il sait analyser — formules de cellule, noms définis, séries de graphique, listes de validation — et laisse toutes les références qui ne sont que du texte pointer vers un nom qui n'existe plus : chaînes INDIRECT, cibles de liens hypertexte, et vos propres macros qui écrivent Worksheets("Sales"). Avant de renommer, sachez duquel des deux types votre classeur dépend. Construisez les noms via une fonction d'assainissement, jamais directement depuis une cellule, et ancrez votre propre code sur le CodeName, qu'aucun renommage ne peut toucher.

Sub RenameMonthSheet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Template")
    ws.Name = "Report " & Format(Date, "yyyy-mm")   ' jamais une date brute : 9/30/2026 contient /
End Sub

Voici le premier volet d'une série de trois sur l'identité d'une feuille. Le nom d'onglet est une étiquette qui appartient à l'utilisateur. Renommer change cette étiquette, masquer retire l'onglet de l'écran sans mettre la feuille hors de portée, et vérifier si une feuille existe demande si une étiquette est déjà prise avant de vous y fier. Le code qui doit survivre aux utilisateurs s'ancre sur quelque chose qu'ils ne peuvent pas changer ; le code qui doit passer par un nom le vérifie d'abord.

Ce que vous allez apprendre

  • Le modèle mental : un renommage est un refactoring avec deux types de références
  • Ce qu'Excel met à jour pour vous, et ce qu'il laisse cassé sans rien dire
  • Les règles de nommage derrière l'erreur 1004, et une fonction d'assainissement qui les respecte
  • Pourquoi nommer une feuille d'après une cellule de date fonctionne dans un pays et plante dans un autre
  • Renommer en masse, et échanger deux noms sans collision
  • Relire le nom d'une feuille, en VBA et dans une formule

Le modèle mental : un renommage est un refactoring

Toute référence à une feuille appartient à l'un de deux types. Une référence analysée est quelque chose qu'Excel comprend comme un pointeur — =Sales!B4 dans une cellule, un nom défini qui fait référence à Sales!$A$1:$A$50, une série de graphique, une liste de validation des données. Excel les stocke comme des pointeurs vers la feuille : quand le nom change, il réécrit le texte à votre place — =Sales!B4 devient ='Sales 2026'!B4, avec des apostrophes ajoutées à cause de l'espace.

Une référence texte est une chaîne qui se trouve épeler le nom. Excel ignore qu'elle pointe quelque part : un renommage la laisse donc exactement telle quelle — et elle ne pointe plus vers rien :

Référence Type Après un renommage
=Sales!B4 dans une cellule analysée mise à jour automatiquement
Noms définis, séries de graphique, listes de validation, mises en forme conditionnelles analysée mis à jour automatiquement
Formules dans d'autres classeurs ouverts analysée mises à jour automatiquement
=INDIRECT("Sales!B4") texte #REF!
=HYPERLINK("#Sales!A1", "Go") et liens hypertexte insérés texte le lien ne mène nulle part
Worksheets("Sales") en VBA texte erreur d'exécution 9
Liaisons depuis des classeurs fermés pendant le renommage chemin stocké cassées à la prochaine mise à jour

Ce tableau, c'est tout l'article en miniature. Le renommage lui-même n'échoue jamais en silence ; ce sont ses références texte qui le font.

Renommer une feuille, et relire son nom

La mécanique tient en une seule propriété, en lecture et en écriture :

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sales")

Debug.Print ws.Name              ' lecture : "Sales"
ws.Name = "Sales 2026"           ' ecriture : l'onglet change aussitot
Debug.Print ActiveSheet.Name     ' le nom de la feuille active, quelle qu'elle soit

Gardez la feuille dans une variable avant de la renommer, comme ci-dessus. Une fois le nom changé, Worksheets("Sales") ne la trouve plus, mais la variable pointe toujours vers le même objet feuille — le reste de la macro continue donc de fonctionner. C'est pour la même raison que votre code destiné à durer doit utiliser le CodeName de la feuille (Sheet3, défini dans la fenêtre Propriétés de l'éditeur VBA) : c'est une référence analysée à l'intérieur de VBA, et le guide Worksheets montre pourquoi aucun renommage d'onglet ne peut la casser. Le CodeName est en lecture seule pendant l'exécution du code : vous ne pouvez donc pas renommer le CodeName d'une feuille depuis une macro comme vous renommez son onglet.

Pour afficher le nom de la feuille dans une cellule, utilisez une formule plutôt que du code :

' Dans une cellule (Excel 365) :  =TEXTAFTER(CELL("filename", A1), "]")
' Renvoie le nom de la feuille qui contient la formule ; vide tant que le classeur n'est pas enregistre.

Les règles de nommage derrière l'erreur 1004

Excel refuse tout nom qui enfreint l'une de ses règles, et chaque refus est la même erreur d'exécution 1004 :

  • 31 caractères au maximum, et non vide.
  • Aucun des caractères : \ / ? * [ ].
  • Pas d'apostrophe en premier ni en dernier caractère.
  • Pas identique à une autre feuille du classeur, sans distinction de casse (sales entre en collision avec Sales).
  • Pas History, qu'Excel en anglais réserve à sa feuille de suivi des modifications.

Le guide Add Sheet couvre ces règles au moment où une nouvelle feuille reçoit son premier nom. Pour les renommages, la réponse pratique est de ne jamais affecter un nom que vous n'avez pas nettoyé. Une petite fonction d'assainissement gère toutes les règles sauf l'unicité :

Function SafeSheetName(ByVal s As String) As String
    Dim ch As Variant
    For Each ch In Array(":", "\", "/", "?", "*", "[", "]")
        s = Replace(s, ch, "-")
    Next ch
    s = Left$(Trim$(s), 31)
    Do While Left$(s, 1) = "'"
        s = Mid$(s, 2)
    Loop
    Do While Right$(s, 1) = "'"
        s = Left$(s, Len(s) - 1)
    Loop
    If Len(s) = 0 Then s = "Sheet"
    SafeSheetName = s
End Function

Tronquez avant de retirer les apostrophes, pas après : couper à 31 caractères peut faire apparaître une apostrophe à la nouvelle fin.

Le piège : nommer une feuille d'après une cellule

Le renommage le plus courant dans les vrais classeurs, c'est « nommer chaque feuille d'après la valeur de A1 ». Cela semble inoffensif :

ws.Name = ws.Range("A1").Value     ' A1 contient une date

Si A1 contient une date, .Value renvoie un Date, et VBA le convertit en texte selon le format de date courte des paramètres régionaux de l'ordinateur. Sur un PC allemand, cela donne 30.09.2026 — un nom de feuille parfaitement légal. Sur un PC américain, c'est 9/30/2026, et les barres obliques déclenchent l'erreur 1004. La même macro passe tous les tests à Munich et plante à Chicago. (Sur un PC français, vous obtenez 30/09/2026 : des barres obliques là aussi, et le même plantage.) Les nombres portent une version plus discrète du même problème : le séparateur décimal change lui aussi avec la région.

La solution consiste à décider vous-même du texte, puis à l'assainir :

Dim v As Variant
v = ws.Range("A1").Value
If IsDate(v) Then
    ws.Name = SafeSheetName(Format(v, "yyyy-mm-dd"))
Else
    ws.Name = SafeSheetName(CStr(v))
End If

Format avec un motif explicite produit le même texte sur toutes les machines. C'est la règle pour tout nom construit à partir de données : c'est vous qui formatez, pas les paramètres régionaux.

Renommer en masse, et échanger deux noms

Les renommages en masse échouent sur des collisions, généralement à mi-parcours, et laissent un classeur à moitié renommé. Deux habitudes l'évitent. D'abord, rendez chaque nom cible unique avant de l'affecter, en vous appuyant sur la vérification d'existence de feuille :

Function UniqueSheetName(wb As Workbook, ByVal base As String) As String
    Dim nm As String, n As Long
    nm = base
    Do While SheetExists(nm, wb)
        n = n + 1
        nm = Left$(base, 31 - Len(" (" & n & ")")) & " (" & n & ")"
    Loop
    UniqueSheetName = nm
End Function

Ensuite, quand deux feuilles échangent leurs noms, passez par un nom temporaire. Renommer A en B alors que B existe encore crée un doublon et déclenche 1004 ; un échange en trois étapes n'entre jamais en collision :

Sub SwapSheetNames(ws1 As Worksheet, ws2 As Worksheet)
    Dim n1 As String, n2 As String
    n1 = ws1.Name: n2 = ws2.Name
    ws1.Name = "~swap~"
    ws2.Name = n1
    ws1.Name = n2
End Sub

Ne changer que la casse — sales en Sales — n'est pas une collision : c'est la même feuille, et Excel l'accepte.

Le jugement : chercher les références texte avant de renommer

Un renommage fait à la main a le même effet qu'un renommage fait en code : la décision ne porte donc pas sur VBA. Elle porte sur le type de référence dont dépend le classeur. Si tout ce qui pointe vers la feuille est une référence analysée, renommez librement : Excel se charge du refactoring. Si quoi que ce soit épelle le nom sous forme de texte — INDIRECT, un lien hypertexte, une macro, une étape Power Query qui lit la feuille par son nom — cherchez d'abord l'ancien nom (Ctrl+F, Regarder dans : Formules, Dans : Classeur, et Ctrl+Maj+F dans l'éditeur VBA) et corrigez ces occurrences dans la même modification. Ma règle : renommez les feuilles que l'utilisateur voit, mais ne faites jamais dépendre votre code de leur nom. Gardez vos macros sur des CodeNames ou sur des variables que vous définissez une fois avec Set, et un renommage reste ce qu'il devrait être — un changement d'étiquette.

Comment ExcelMaster vous aide

Les problèmes de renommage apparaissent loin du renommage : un INDIRECT qui se transforme en #REF! le mois suivant, une macro qui meurt sur l'erreur 9 la première fois qu'un collègue range les onglets, une feuille mensuelle qui n'échoue que sur l'ordinateur portable réglé en dates américaines.

ExcelMaster vous laisse décrire la tâche — « renomme chaque feuille d'après la région en A1, et corrige tout ce qui pointe encore vers les anciens noms » — puis écrit le renommage avec des noms assainis et uniques, retrouve les références texte qu'un renommage laisserait derrière lui et les met à jour dans la même passe.

Questions fréquentes

Comment renommer une feuille en VBA ?

Définissez sa propriété Name : Worksheets("Sheet1").Name = "Sales", ou ActiveSheet.Name = "Sales" pour la feuille active. Gardez d'abord la feuille dans une variable si la macro continue de l'utiliser ensuite, car Worksheets("Sheet1") ne la trouve plus une fois le nom changé.

Pourquoi ai-je l'erreur 1004 en renommant une feuille ?

Le nom enfreint une règle : il dépasse 31 caractères, il est vide, il contient l'un des caractères : \ / ? * [ ], il commence ou se termine par une apostrophe, il vaut History, ou il correspond à une autre feuille du classeur sans distinction de casse. Nettoyez le nom avec une fonction d'assainissement et vérifiez qu'il n'est pas déjà pris avant de l'affecter.

Les formules sont-elles mises à jour quand je renomme une feuille ?

Les formules qui font directement référence à la feuille, comme =Sales!B4, sont mises à jour automatiquement, tout comme les noms définis, les graphiques et les listes de validation. Les références écrites sous forme de texte ne le sont pas : INDIRECT("Sales!B4"), les cibles de liens hypertexte et les chaînes VBA comme Worksheets("Sales") gardent l'ancien nom et cassent.

Comment renommer une feuille d'après la valeur d'une cellule ?

Lisez la cellule, convertissez vous-même la valeur en texte, puis assainissez-la : utilisez Format(value, "yyyy-mm-dd") pour les dates et CStr pour tout le reste, et faites passer le résultat par une fonction qui retire les caractères interdits. Affecter directement une cellule de date fait dépendre le nom du format de date régional du PC.

Comment obtenir le nom de la feuille active en VBA ?

Lisez ActiveSheet.Name. Pour une feuille précise, lisez ws.Name sur une variable feuille. Pour afficher le nom d'une feuille dans une de ses cellules, utilisez =TEXTAFTER(CELL("filename", A1), "]") dans Excel 365, ce qui fonctionne dès que le classeur a été enregistré.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 30/09/2026.

Guides associés : VBA Hide Sheet · VBA Check If Sheet Exists · VBA Worksheets · VBA Add Sheet · VBA Copy Sheet · VBA Format · VBA Replace · VBA Named Range