Accueil | Ce site | CV | Excel | Livre d’or | Macros XL4 | Modèles | VBA

 La portée des variables et des procédures

La portée est la zone dans laquelle un élément peut être utilisé en étant identifié. Par élément, nous entendons, une variable, une constante, une procédure ou une fonction.

En ce qui concerne la portée, variables et constantes obéissent aux mêmes règles. Tout ce qui, dans cette page, concerne les variables s’applique donc également aux constantes.

De même, les fonctions (Function) suivent les mêmes règles que les procédures (Sub).

De manière générale, il faut restreindre au maximum la portée pour éviter les conflits : peu importe qu’on utilise la variable “i” dans différentes boucles du type :

        For i = 1 To NbLignes
            ' Code exécuté dans la boucle
       	Next i

si chaque occurrence de la variable “i” a une portée locale.

Portée des variables (et des constantes)

Une variable est en général définie à l’aide du mot-clef standard Dim. Elle peut être définie au niveau d’un module ou au sein d’une procédure (ou d’une fonction).

Voici 2 exemples de définition de variables avec Dim :


Fig. 1 - Le curseur (trait vertical) est en ligne 2, après “Boolean”


Fig. 2 - Le curseur est cette fois en ligne 5, après “Integer”

Le contenu des figures 1 et 2 est identique, à la position du curseur près. Cette simple nuance entraîne une autre différence dans le menu déroulant situé en haut à droite dans les 2 figures. est remplacé par .

Le fait que le menu de la figure 1 contienne le texte “Déclarations” confirme que la partie supérieure du module, située avant la première procédure ou fonction est destinée à déclarer des variables et/ou des constantes. Celles-ci sont dites “de niveau module” et peuvent être employées dans toute procédure ou fonction située dans le même module. C’est le cas de la variable “Choix”, définie comme un booléen.

Dans la figure 2, le menu contient le texte “SaisieNum”, qui est le nom de la procédure dans laquelle se trouve le curseur. Une variable définie à l’intérieur d’un Sub …End Sub est dite de niveau procédure. Elle n’est utilisable qu’au sein de cette procédure. On dit également qu’elle n’est visible qu’à l’intérieur de la procédure où elle est définie. Cette dernière expression est en fait un raccourci qui signifie que la définition de la variable n’est pas visible, lorsque la variable est au mauvais endroit, on pourrait dire “hors de portée”.

Si l’on tente d’utiliser une variable qui n’a pas été définie ou qui n’est pas visible à l’endroit où elle est employée, un message d’ erreur est affiché (figure 3).


Fig. 3 - Message d’erreur si on tente d’employer une variable
sans l’avoir définie au préalable, ou si elle n’est pas visible.

Il est possible d’accroître la portée d’une variable en utilsant le mot-clef Public à la place de Dim. Elle est alors utilisable dans tout VBComponent du projet où elle a été définie.

Une variable définie avec Public doit l’être au niveau module, dans un module classique ou un module de classe : il n’est pas possible de définir ce type de variable dans le code associé à une feuille de classeur ou à un UserForm.

On peut également utiliser Private à la place de Dim, mais cela n’a aucun effet : pour une variable ou une constante, Private et Dim sont équivalents. Certains puristes considèrent qu’il faut utiliser Private pour définir une variable au niveau module, et Dim au niveau procédure. Le seul intérêt réel de Private est memnotechnique, pour montrer qu’une variable n’est pas Public.

Enfin, une variable peut être définie avec Static, mais cela modifie sa durée de vie, mais pas sa portée.

Portée des procédures (et des fonctions)