Comment renommer automatiquement une feuille en fonction d’une cellule Excel ?
Dans ce tutoriel, nous allons répondre à la question posée par Jérémie qui souhaite savoir s’il est possible de renommer automatiquement une feuille de calcul Excel à partir d’une valeur saisie dans une cellule, en utilisant le langage VBA.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
1. Présentation
Comme nous venons de le voir dans l’introduction de ce tutoriel, nous allons maintenant voire comment renommer une feuille de calcul en utilisant le contenu d’une cellule.
Pour cela, nous allons bien entendu devoir passer par le développement d’une petite macro-commande en VBA.
Pour que ce tutoriel soit accessible à tout le monde, nous allons revenir dans le détail sur aspect de cette dernière.
Si vous souhaitez aller plus loin dans la découverte du langage VBA, vous pouvez évidemment consulter la formation disponible sur le blog en cliquant ici.
Pour commencer, nous allons lancer l’éditeur de code VBE (pour Visual Basic Editor), qui est l’éditeur de code intégré dans les différentes applications de la suite Office et qui permet de développer des macro-commandes en VBA.
Pour cela, nous appuyons simplement sur les touches [Alt]+[F11] :
2. Création de la macro-commande
Dans un premier temps, nous allons créer une petite macro-commande VBA pour modifier le nom de l’onglet.
Pour cela, nous créons un nouveau module (depuis le menu Insertion > Module).
Ce module est une feuille vierge qui va nous permettre de saisir nos lignes de code.
Ensuite, pour créer la macro nous saisissons la ligne suivante :
Sub renommerFeuille()
End Sub
Pour renommer une feuille, il suffit de modifier la propriété Name de l’objet ActiveSheet :
ActiveSheet.Name = "Nouveau nom"
Nous pouvons alors lancer la macro-commande en appuyant sur la touche [F5].
Si tout va bien, la feuille devrait avoir changé de nom :
Pour affecter la valeur d’une cellule à ce nom, il ne reste plus qu’à utiliser la valeur de celle-ci :
ActiveSheet.Name = [b6]
Nous pouvons également utiliser une concaténation d’une autre cellule, ou alors d’un texte brut en utilisant une esperluette (« & ») :
ActiveSheet.Name = "Tableau de bord " & [b6]
Maintenant, imaginons qu’un jour, nous déplaçions la cellule contenant l’année sur la feuille de calculs :
Inutile de lancer la macro-commande pour comprendre que cela ne pourra plus fonctionner étant donné que la cellule B6 est maintenant déplacée aux coordonnées B8.
Pour anticiper ce genre de problème, il suffit de donner un nom à la cellule que nous pourrons ensuite utiliser très facilement depuis VBA.
Pour cela, nous sélectionnons la cellule, puis nous nous rendons dans le menu Formules, afin de cliquer sur le bouton « Définir un nom » :
Ici, nous saisissons le nom à donner à la feuille, par exemple « annee » et nous spécifions bien que ce nom doit avoir une portée limitée à la feuille de calculs actuelle (qui s’appelle maintenant « Tableau de bord 2020 ») :
Ensuite, nous valions en appuyant sur le bouton [OK].
De retour dans le code VBA, nous pouvons maintenant appeler la cellule directement avec ce nom :
ActiveSheet.Name = "Tableau de bord " & [annee]
Maintenant, la valeur récupérée ne sera plus dépendante de la position de la cellule.
Le fait d’avoir utilisé une portée limitée à la feuille de calcul, et non pas à l’ensemble du classeur nous permet de pouvoir dupliquer facilement la feuille tout en conservant la possibilité de renommer la feuille :
Attention, maintenant que nous avons plusieurs feuilles de calcul, nous devons vérifier que la feuille actuelle peut effectivement être renommée sans accroc.
Il est en effet impossible de donner un nom déjà affecté à une autre feuille.
Dans ce cas, Excel nous affichera alors une erreur 1004 avec le message « Désolé… Ce nom est déjà attribué. Veuillez utiliser un autre nom. » :
Pour éviter ce problème, nous allons poser une étiquette à la fin de la macro que nous appelons « Err » et qui va nous permettre d’afficher un message à l’utilisateur.
Comme nous l’avons déjà vu dans un tutoriel dédié aux étiquettes, celles-ci permettent de se rendre directement à un endroit donné au sein d’une macro en l’appelant simplement par son nom :
Err:
MsgBox "Impossible de renommer la feuille, veuillez vérifier le nom..."
Pour éviter de lancer le code affecté à l’étiquette lors de chaque lancement de la macro, nous ajoutons un « Exit Sub » juste avant l’étiquette :
Exit Sub
Err:
MsgBox "Impossible de renommer la feuille, veuillez vérifier le nom..."
Ensuite, il ne reste plus qu’à ajouter un contrôle d’erreur avant de renommer la feuille qui va se charger de rediriger le programme vers l’étiquette en cas d’erreur :
On Error GoTo Err
ActiveSheet.Name = "Tableau de bord " & [annee]
Si vous souhaitez en savoir plus sur la gestion et l’utilisation des erreurs de VBA, vous pouvez consulter le tutoriel dédié en cliquant ici.
Maintenant, si nous relançons la macro, Excel nous informera qu’il est impossible de renommer la feuille :
Et voilà, notre macro est maintenant terminée, il ne reste plus qu’automatiser son lancement chaque fois que nous modifions la valeur contenue dans la cellule « annee ».
Pour cela, nous définir un évènement, qui permet de lancer une macro commande chaque fois que quelque chose en particulier se passe sur le classeur, ou sur une feuille de calcul.
Pour créer un évènement, nous devons nous rendre dans la feuille de code de la feuille de calcul, en double cliquant sur celle-ci depuis le navigateur de projet de VBA :
Puis, dans le premier menu déroulant qui se trouve au-dessus de la feuille de code, nous choisissons Worksheet :
Et dans le second Change :
VBA nous ajoute alors automatique l’évènement « Worksheet_Change » :
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Il nous suffira alors de contrôler que la cellule modifiée (que VBA nous retourne dans la variable Target) est bien la cellule « annee » et dans ce cas-là, nous pourrons lancer la macro renommerFeuille.
Pour cela, la méthode la plus simple consiste simplement à comparer les adresses des cellules Target et « annee » :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = [annee].Address Then
renommerFeuille
End If
End Sub