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

VBA Worksheets dans Excel — référencer une feuille pour que renommer un onglet ne puisse rien casser

|

VBA Worksheets dans Excel — référencer une feuille pour que renommer un onglet ne puisse rien casser

TL;DRWorksheets est une collection, et vous y adressez une feuille de trois manières : par nom (Worksheets("Jan")), par index (Worksheets(1)), ou par CodeName (Sheet1). Le nom casse à l'instant où un utilisateur renomme l'onglet ; l'index casse à l'instant où quelqu'un fait glisser les onglets dans un nouvel ordre ; le CodeName ne casse sur aucun des deux, parce que vous seul pouvez le changer. Qualifiez la collection avec un classeur, faites Set de la feuille dans une variable une seule fois, et préférez le CodeName pour les onglets que vous contrôlez.

Sub ThreeWaysToNameASheet()
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("Jan")   ' par nom  - casse si l'onglet est renomme
    Set ws = ThisWorkbook.Worksheets(1)        ' par index - casse si les onglets sont reordonnes
    Set ws = Sheet1                            ' par CodeName - survit aux deux

    ws.Range("A1").Value = "Report"
End Sub

Ce que vous allez apprendre

  • Le modèle mental — Worksheets est une collection que vous pouvez adresser de trois façons différentes
  • Les trois outils de référence, et la place de la collection Worksheets parmi eux
  • Worksheets face à Sheets, et la différence des feuilles de graphique qui compte vraiment
  • Les trois façons de nommer une feuille, et exactement ce qui casse chacune
  • Le piège silencieux — pourquoi une macro qui marche meurt le jour où un utilisateur renomme un onglet
  • L'avis — faites Set une fois, qualifié, et préférez le CodeName

Le modèle mental : une collection, adressée de trois manières

Worksheets n'est pas un objet unique — c'est la collection de toutes les feuilles de calcul d'un classeur. Pour faire quoi que ce soit à une feuille, vous l'extrayez de la collection par un identifiant. VBA vous donne trois identifiants, et ils ne sont pas également solides :

  1. Par nomWorksheets("Jan") — le texte sur l'onglet. Lisible, et le plus courant. Aussi le plus fragile, car le nom d'onglet est la seule chose que vos utilisateurs changent librement.
  2. Par indexWorksheets(1) — la position, de gauche à droite. Pratique pour « la première feuille », inutile dès que quelqu'un fait glisser les onglets.
  3. Par CodeNameSheet1 — un nom interne que seul un développeur peut changer, dans la fenêtre Propriétés (Properties window). Invisible aux utilisateurs, il survit donc à tout ce qu'ils font aux onglets.

Choisir quel identifiant utiliser, c'est choisir à quel point votre macro sera fragile. C'est toute la leçon.

La collection Worksheets parmi les trois outils de référence

Nommer la feuille n'est que la moitié d'une référence — vous devez aussi dire dans quel classeur elle vit. C'est là qu'interviennent les deux autres outils de cet ensemble.

Outil Ce qu'il désigne À associer avec
ThisWorkbook Le classeur qui contient ce code — fixe .Worksheets("Jan") pour atteindre un onglet précis de votre propre fichier
ActiveWorkbook / ActiveSheet Ce qui est au premier plan en ce moment — versatile Rarement — seulement pour les outils génériques
Worksheets(...) Une feuille nommée dans un classeur Toujours un classeur devant elle — ThisWorkbook.Worksheets(...)

La règle qui relie l'ensemble s'applique ici aussi : un Worksheets("Jan") non qualifié plonge dans le classeur actif. Mettez un classeur devant lui — ThisWorkbook.Worksheets("Jan") — pour que la feuille soit recherchée dans le fichier que vous visez, et non dans ce que l'utilisateur a cliqué en dernier.

Worksheets face à Sheets : la différence qui mord

Worksheets et Sheets semblent interchangeables et se comportent d'ordinaire ainsi, mais ce ne sont pas la même collection. Sheets contient tous les onglets — feuilles de calcul et feuilles de graphique. Worksheets ne contient que les feuilles de grille dans lesquelles vous tapez.

Debug.Print ThisWorkbook.Worksheets.Count   ' feuilles de grille seulement
Debug.Print ThisWorkbook.Sheets.Count        ' feuilles de grille + feuilles de graphique

La plupart des classeurs n'ont aucune feuille de graphique, donc les deux comptes coïncident et personne ne le remarque. Ajoutez une feuille de graphique et les nombres divergent — et une boucle sur Sheets qui suppose que chaque élément est une feuille de calcul tombera sur la feuille de graphique et lèvera une erreur sur une propriété propre aux feuilles de calcul. Utilisez Worksheets quand vous visez les feuilles de grille, ce qui est presque toujours le cas. Ne recourez à Sheets que lorsque vous voulez délibérément aussi les feuilles de graphique dans la boucle.

Les trois façons de nommer une feuille, et ce qui casse chacune

Alignez-les face aux deux choses que les utilisateurs et les développeurs font réellement — renommer les onglets, et les réordonner :

' Par nom : lisible, mais le nom d'onglet est modifiable par l'utilisateur
Set ws = ThisWorkbook.Worksheets("Jan")
' l'utilisateur renomme l'onglet en "January"  ->  Subscript out of range

' Par index : base sur la position, bien jusqu'a ce que les onglets bougent
Set ws = ThisWorkbook.Worksheets(1)
' l'utilisateur glisse "Summary" en tete  ->  pointe maintenant la mauvaise feuille

' Par CodeName : nom interne reserve au developpeur, invisible aux utilisateurs
Set ws = Sheet1
' renommez l'onglet, reordonnez les onglets  ->  toujours la meme feuille

Le nom est le plus agréable à lire et le plus facile à casser pour un utilisateur. L'index survit aux renommages mais pas au réordonnancement. Le CodeName — défini une fois dans la fenêtre Propriétés (Properties window) de l'éditeur VBA, sous (Name) — est le seul qui survit aux deux, car aucun bouton de l'interface Excel ne le change. Pour toute feuille livrée dans le cadre de votre outil, le CodeName est la référence solide.

Le piège silencieux : une macro qui meurt à un renommage

C'est la défaillance qui génère le ticket de support. Votre macro lit Worksheets("Data") et marche pendant des mois. Un utilisateur fait du rangement et renomme l'onglet de Data en 2026 Data. Rien dans votre code n'a changé, pourtant chaque exécution s'arrête désormais sur Subscript out of range à la ligne qui nomme la feuille — et le message pointe vers la recherche, pas vers le renommage qui l'a réellement causée.

' FRAGILE - a un renommage pres de casser
ThisWorkbook.Worksheets("Data").Range("A1").Value = total

' SOLIDE - le CodeName ne peut pas etre change depuis l'interface Excel
Sheet1.Range("A1").Value = total

Si vous devez vous appuyer sur le nom d'onglet (pour les feuilles que l'utilisateur crée), encadrez-le : vérifiez que la feuille existe avant de la toucher, ou parcourez la collection et faites correspondre. Mais pour les feuilles qui vous appartiennent, sautez entièrement la fragilité et utilisez le CodeName. C'est la différence entre une macro qui survit à un rangement et une qui n'y survit pas.

L'avis : faites Set une fois, qualifié, préférez le CodeName

Adressez une feuille une seule fois, en haut de la macro, dans une variable Worksheet — qualifiée par un classeur — et travaillez via cette variable partout ensuite. Ça se lit mieux, c'est plus rapide que de re-rechercher la feuille à chaque ligne, et ça place l'unique référence fragile à exactement un endroit au lieu de l'éparpiller dans le code.

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Jan")   ' une recherche, qualifiee
ws.Range("A1").Value = 100
ws.Range("A2").Value = 200                 ' pas de nouvelle recherche, aucune ambiguite

Pour les feuilles que vous contrôlez, faites de cette référence le CodeName (Set ws = Sheet1) pour qu'un utilisateur qui renomme l'onglet n'atteigne jamais votre code. Gardez la chaîne de nom pour les feuilles qui appartiennent à l'utilisateur, et encadrez celles-là. Le but est le même qui traverse tout cet ensemble : dire exactement quel objet vous visez, une fois, et ne jamais laisser la macro deviner.

Quand vous préféreriez décrire la feuille plutôt que la traquer

La moitié de la bataille avec les feuilles est de la comptabilité — quel onglet, quel nom, existe-t-il encore, dans quel classeur. ExcelMaster vous laisse sauter cette comptabilité : décrivez le résultat — « pour chaque onglet mensuel de ce fichier, totalise la colonne D sur la feuille de synthèse » — et il écrit et exécute un code qui qualifie chaque référence et gère les feuilles manquantes ou renommées, en sauvegardant d'abord votre classeur. Vous nommez le résultat voulu ; il résout les feuilles en toute sûreté pour qu'un renommage ou un réordonnancement ne mette pas toute la macro à terre.

Foire aux questions

Quelle est la différence entre Worksheets et Sheets en VBA ?

Worksheets est la collection des seules feuilles de calcul en grille. Sheets est la collection de tous les onglets, y compris les feuilles de graphique. Elles renvoient la même chose quand un classeur n'a aucune feuille de graphique, mais une boucle sur Sheets qui suppose que chaque élément est une feuille de calcul lèvera une erreur sur une feuille de graphique. Utilisez Worksheets sauf si vous voulez spécifiquement inclure les feuilles de graphique.

Comment référencer une feuille par son nom en VBA ?

Utilisez ThisWorkbook.Worksheets("SheetName"), avec le classeur devant pour que la recherche se fasse dans le fichier que vous visez. Le nom doit correspondre exactement au texte de l'onglet, et si la feuille n'existe pas vous obtenez Subscript out of range. Pour les feuilles que vous contrôlez, le CodeName est une référence plus solide car les utilisateurs ne peuvent pas le changer.

Qu'est-ce qu'un CodeName de feuille en VBA ?

Le CodeName est le nom interne d'une feuille — comme Sheet1 — que vous définissez dans la fenêtre Propriétés (Properties window) de l'éditeur VBA, sous (Name). Contrairement au nom d'onglet, il n'existe aucun moyen pour un utilisateur de le changer depuis l'interface Excel, si bien qu'une référence comme Sheet1.Range("A1") continue de fonctionner même après le renommage ou le déplacement de l'onglet.

Comment affecter une feuille à une variable en VBA ?

Déclarez-la avec Dim ws As Worksheet, puis Set ws = ThisWorkbook.Worksheets("Jan") (ou Set ws = Sheet1 pour le CodeName). La définir une seule fois, qualifiée par un classeur, fait que le reste de votre macro travaille via ws sans re-rechercher la feuille ni dépendre de ce qui est actif.

Pourquoi ai-je Subscript out of range sur Worksheets ?

Parce que le nom ou l'index que vous avez demandé n'est pas dans la collection — d'ordinaire un onglet qui a été renommé ou supprimé, ou un nom saisi avec une mauvaise orthographe ou des espaces en trop. Vérifiez que la feuille existe avant de la toucher, ou référencez-la par CodeName pour qu'un renommage ne puisse pas casser la recherche.

Testé dans

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

Guides associés : VBA ThisWorkbook · VBA ActiveWorkbook · VBA Worksheet · VBA Range · VBA Cells