Les plages nommées avec Excel en VBA

Voilà qui tombe à point

Un élément assez sommaire d’Excel, mais somme toute pas assez utilisé, est les plages nommées.

Donner un nom à une plage a de multiples avantages. D’une part, il est plus simple de retenir ou de retrouver un nom qu’une adresse. D’autre part, cela apporte aussi plus de flexibilité, car il n’y a pas d’impact quant au nom de la plage quand nous modifions la structure de la feuille (ajout de ligne, suppression de colonne, …) contrairement à l’adresse.

De plus, une plage nommée peut être liée au classeur ou à une feuille. De ce fait, il est ainsi possible d’utiliser le même nom dans des feuilles différentes. C’est pratique lorsque plusieurs feuilles sont formatées pareilles ou contiennent des éléments similaires, par exemple avec une valeur "quantité produite" pour des feuilles "Lundi" et "Mardi".

Les plages nommées permettent donc de simplifier la conception et la maintenance de nos fichiers Excel et de nos macros.

Nous allons rappeler leur fonctionnement dans ce billet.

Noms définis

Depuis Excel, les plages nommées se gèrent avec le groupe "Noms définis" du ruban "Formules".

Groupe noms définis.'

Pour le fil rouge de ce billet, nous démarrons en ajoutant trois feuilles à notre classeur : "Paramètres", "Lundi" et "Mardi". Leur contenu sera rempli au fur et à mesure.

Définition d’un nom

Il y a plusieurs façons de définir un nom. Ici, nous optons pour le choix "Définir un nom" du menu contextuel ou depuis le groupe "Noms définis" :

Définir un nom (1).
Définir un nom (1).

Une fenêtre apparaît. Nous modifions le nom et le commentaire comme montré ci-dessous. La zone et la référence nous conviennent pour ce premier exemple.

Définir un nom (2).
Définir un nom (2).

Pour le nom, j’ai pour habitude d’utiliser des majuscules et des tirets bas _, parce que je vois ce nom comme une constante avec mon côté programmeur, mais libre à vous de faire autrement du moment qu’il soit parlant pour les autres usagers.

Après avoir validé, nous voyons que notre cellule C3 a désormais le nom créé.

Définir un nom (3).
Définir un nom (3).

Gestionnaire de noms

Le gestionnaire de noms liste les noms définis pour les plages standards, mais aussi pour d’autres éléments tels que les listes de données ou encore les zones d’impression.

Nous ouvrons le gestionnaire des noms via le bouton approprié du ruban. La fenêtre se présente ainsi :

Gestionnaire de noms.
Gestionnaire de noms.

Nous pouvons filtrer (avec la zone liste à droite) et trier (avec les entêtes de colonne) ces noms. De plus, nous pouvons également ajouter, modifier ou supprimer des noms définis.

Jusqu’à présent, nous n’avons créé qu’un seul nom qui a l’étendue classeur. Nous allons en ajouter trois avec le bouton "Nouveau…" pour la feuille "Lundi" : "QTE_PRODUITE", "QTE_REBUT" et "TAUX_REBUT".

Définir un nom pour une feuille.
Définir un nom pour une feuille.

Nos plages nommées créés, nous en profitons pour définir une formule. Remarquons que celle-ci est ainsi plus aisée à écrire et à lire :

Utilisation de plages nommées dans une formule.
Utilisation de plages nommées dans une formule.

Excel déduit automatiquement que nous faisons référence à la plage nommée de la feuille courante "Lundi" donc nous pouvons omettre le préfixe Lundi! ici.

Notons encore une fois comment la "Zone Nom" (encadrée en orange ci-dessus) nous permet de naviguer rapidement dans les plages nommées de la feuille courante et du classeur.

Passons maintenant aux autres jours de la semaine.

Cela veut dire que nous allons devoir tout refaire ? :o

Nous pourrions, ça nous ferait de l’entraînement, mais il y a plus rapide ! Nous pouvons simplement copier-coller notre tableau d’une feuille à l’autre, en l’occurrence de "Lundi" à "Mardi". Nous vérifions, et il faut tout de même redéfinir le nom pour le taux de rebut en Mardi!C5. Cela fait, nous modifions nos valeurs :

Copier-coller plages nommées zone feuille.
Copier-coller plages nommées zone feuille.

Pour les derniers jours, nous allons faire encore mieux en utilisant la fonctionnalité "Déplacer ou copier…" puis en renommant les feuilles collées. Cette fois-ci, tous les noms sont bien reportés.

Résultat final après copie et renommage des feuilles collées.
Résultat final après copie et renommage des feuilles collées.

Le gestionnaire de noms contient bien tous nos noms définis selon l’étendue souhaitée.

Nous n’aurons pas recours à de grandes plages pour ce cours, sachez simplement qu’une plage nommée s’étendant sur plusieurs lignes ou colonnes sera automatiquement redimensionnée lors de l’ajout ou la suppression de ligne ou colonne à l’intérieur de celle-ci.

Au cours de cette section, nous avons vu comment gérer les noms définis du classeur avec Excel.

Syntaxe VBA

Il est temps de voir un peu de syntaxe VBA concernant les plages nommées.

Lecture d’une plage nommée

L’accès à une plage nommée peut se faire avec son nom au lieu de son adresse :

Sheets("Paramètres").Range("TAUX_MAX_REBUT_TOLERE") ' 0.03
' équivalent de Sheets("Paramètres").Range("C3")

La collection Names

Les noms définis sont stockés dans la collection Names de la feuille, du classeur ou encore de l’application.

Ajouter un nom

Pour rajouter un nom, il faut faire appel à la méthode Add de celle-ci en indiquant au moins un nom et une adresse.

Private Sub Exemple_Ajout_Names()
    Sheets("Paramètres").Range("B4") = "Quantité min. à produire"
    Sheets("Paramètres").Range("C4") = 1000
    
    ' Ajout étendue classeur
    ActiveWorkbook.Names.Add Name:="QTE_MIN_PRODUCTION", RefersTo:="=Paramètres!$C$4"
     
    ' Ajout étendue feuille paramètres
    ActiveWorkbook.Sheets("Paramètres").Names.Add Name:="QTE_MIN_PRODUCTION", RefersTo:="=Paramètres!$C$4"
End Sub

Elle accepte plusieurs types de coordonnées possibles comme indiqué dans la documentation. Si nous souhaitons ajouter un commentaire, il faut le faire ensuite en modifiant la propriété adéquate.

Parcourir les noms

Comme Names est une collection, nous la parcourons comme attendu :

Private Sub Exemple_Iteration_Names()
    Dim vName As Variant
    For Each vName In ActiveWorkbook.Names
        Debug.Print vName.Name, vName.Comment
    Next vName
End Sub

L’objet Name

L’objet Name correspond à un nom défini.

Modification

Il possède plusieurs propriétés, que ce soit pour lire/écrire le commentaire (Comment) ou encore la référence (RefersTo / RefersToR1C1 / …).

Private Sub Exemple_Ajout_Modification_Name()
    ' Nom défini étendue classeur
    ActiveWorkbook.Sheets("Paramètres").Names("QTE_MIN_PRODUCTION").Comment = "Feuille"
End Sub

Je ne sais pas à quoi c’est du, mais j’ai rencontré des comportements étranges à cause de ces propriétés commentaires durant mes tests. Il se peut que vous rencontriez vous-aussi des problèmes, ce qui vous évitera de chercher…

Suppression

Un nom peut être supprimé avec son unique méthode Delete.

Private Sub Exemple_Suppression_Name()
    ' Nom défini étendue feuille
    ActiveWorkbook.Sheets("Paramètres").Names("QTE_MIN_PRODUCTION").Delete
End Sub

Durant cette section, nous avons vu comment se traduisaient les plages nommées en VBA.

Exemple final

Voici un exemple final afin de montrer la flexibilité apportée par les plages nommées dans les macros.

Dans celui-ci, nous nous basons sur le classeur construit jusqu’à présent pour déterminer les jours où le taux de rebut a été supérieur au toléré ou bien la production n’a pas atteint son objectif (hors vendredi que nous considérons comme non travaillé en entier pour cette seconde condition).

Option Explicit

' Feuille des paramètres
Private Const FEUILLE_PARAMS_NOM As String = "Paramètres"
Private Const PLAGE_TAUX_MAX_REBUT_TOLERE As String = "TAUX_MAX_REBUT_TOLERE"
Private Const PLAGE_QTE_MIN_PRODUCTION As String = "QTE_MIN_PRODUCTION"

' Autres feuilles
Private Const PLAGE_QTE_PRODUITE As String = "QTE_PRODUITE"
Private Const PLAGE_TAUX_REBUT As String = "TAUX_REBUT"

Private Const JOUR_VENDREDI As String = "Vendredi"
Private Function JOURS()
    JOURS = Array("Lundi", "Mardi", "Mercredi", "Jeudi", JOUR_VENDREDI)
End Function

Private Sub Main()
    Application.ScreenUpdating = False
    
    Dim dTauxMaxRebutTolere As Double
    Dim dQteMinProductionTotere As Double
    Dim vJour As Variant
    
    dTauxMaxRebutTolere = Sheets(FEUILLE_PARAMS_NOM).Range(PLAGE_TAUX_MAX_REBUT_TOLERE)
    dQteMinProductionTotere = Sheets(FEUILLE_PARAMS_NOM).Range(PLAGE_QTE_MIN_PRODUCTION)
    For Each vJour In JOURS()
        With Sheets(vJour)
            If .Range(PLAGE_TAUX_REBUT) > dTauxMaxRebutTolere Or _
                .Name <> JOUR_VENDREDI And .Range(PLAGE_QTE_PRODUITE) < dQteMinProductionTotere Then
                    Debug.Print (vJour)
                    Beep
                    ' Lundi
                    ' Mercredi
            End If
        End With
    Next vJour
    
    Application.ScreenUpdating = True
End Sub

Durant ce billet, nous avons rappelé l’intérêt des plages nommées et leur usage.

Opter pour les plages nommées, c’est s’offrir un peu plus de tranquillité.

À bientôt !

Quelques ressources :

Aucun commentaire

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte