• Aucun résultat trouvé

Procédures Sub

Dans le document VBA et Excel (Page 147-152)

On distingue différents types de procédures, en fonction du type de tâche qu’exécute la procédure. Les types essentiels de procédures sont :

les procédures de type Sub ;

les procédures de type Property ;

les procédures de type Function.

Procédures Sub

Une procédure Sub (ou sous-routine) est une série d’instructions exécutant une tâche déter-minée au sein du projet, sans renvoyer de valeur. Une procédure Sub est structurée de la façon suivante :

Sub NomDeLaProcédure() Instructions ...

End Sub

Les instructions Sub et End Sub déterminent le début et la fin de la procédure. NomDeLaPro-cédure correspond au nom attribué à votre procédure et doit respecter les règles d’affec-tation de noms de Visual Basic présentées dans la note suivante. Ce nom est utilisé pour invoquer la procédure à partir d’une autre procédure. Dans le cas d’une macro enregistrée ou créée à partir d’Excel, il s’agit du nom attribué à la macro dans la boîte de dialogue Macro ou Enregistrer une macro. Instructions correspond aux instructions qu’exécute la procédure.

Les noms de procédures, comme les noms de variables et de constantes, doivent obéir aux règles d’affectation de noms de Visual Basic. Ils doivent systémati-quement :

• contenir au maximum 255 caractères ;

• commencer par une lettre ;

• ne pas comprendre d’espace et ne pas utiliser les caractères @, &, $,

#, ainsi que le point et le point d’exclamation ;

• ne pas être identique à un mot clé du langage, pour éviter tout conflit.

Attention

Chapitre 5 Développer dans Visual Basic Editor 137

L’instruction de déclaration Sub peut aussi contenir des arguments optionnels, selon la syntaxe suivante :

[Private | Public] [Static] Sub NomDeLaProcédure([Arguments]) Instructions

...

End Sub

Private ou Public indique si la procédure est privée ou publique. Une procédure publique peut être invoquée par n’importe quelle procédure du projet, y compris les procédures stoc-kées dans d’autres modules. Une procédure privée ne peut être invoquée qu’à partir d’une procédure stockée dans le même module. On parle de portée de la procédure. Lorsque les mots clés Private et Public sont omis dans la déclaration de procédure, la procédure est publique.

L’option Static indique que les variables de la procédure Sub conservent leurs valeurs entre les différents appels de la procédure. Autrement dit, si une procédure Static est invo-quée à plusieurs reprises lors de l’exécution d’un programme, à chaque appel, les variables propres à cette procédure ont la valeur qui leur a été affectée lors de l’appel précédent.

Arguments représente les arguments (des valeurs) passés à la procédure Sub par la procé-dure appelante. La virgule sert de séparateur entre les différentes valeurs transmises.

Dans l’instruction Sub suivante :

Sub MaProcédure(arg1, arg2)

La procédure MaProcédure est déclarée comme nécessitant les arguments arg1 et arg2. Autrement dit, lorsque la procédure MaProcédure sera appelée, la procédure appelante devra lui transmettre ces arguments ou une erreur sera générée. Les appels de procédures et le passage d’arguments sont étudiés dans la section "Appel et sortie d’une procédure", plus loin dans ce chapitre.

Chacun des arguments de arguments répond à la syntaxe suivante :

[Optional] [ByVal | ByRef] [ParamArray] NomVariable [As type] [=ValeurParDéfaut]

Si vous indiquez des arguments facultatifs à l’aide du mot clé Optional dans la déclaration d’une procédure Sub sans spécifier une valeur par défaut pour les arguments concernés, la procédure doit être conçue pour s’exécuter sans faire appel à ces arguments lorsqu’ils ne sont pas transmis. Dans le cas contraire, une erreur sera générée.

Attention

138 Excel et VBA

Tableau 5.1 : Déclaration d’arguments dans une instruction Sub

Élément Description

Optional Ce mot clé indique que les arguments transmis sont facultatifs. Aucune erreur ne sera générée si la procédure appelante ne passe pas les arguments précédés de ce mot clé.

Lorsque vous déclarez un argument Optional, les arguments qui suivent doivent aussi être déclarés Optional. Si vous souhaitez déclarer des arguments facultatifs et d’autres obligatoires, vous devez d’abord déclarer les arguments obligatoires.

Dans l’instruction Sub suivante Sub MaProcédure(arg1, arg2, Optional arg3, Optional arg4), les arguments arg1 et arg2 doivent obligatoirement être passés par la procédure appelante, tandis que les arguments arg3 et arg4 sont facultatifs.

ByVal ou ByRef Ces mots clés indiquent respectivement que l’argument est passé par valeur ou par référence.

Lorsqu’un argument est passé par valeur, c’est la valeur de la variable, et non son adresse, qui est transmise à la procédure appelée. Autrement dit, la valeur de la variable passée est exploitée par la procédure appelée, mais ne peut être modifiée. Lorsqu’un argument est passé par référence, c’est l’adresse de la variable qui est passée. La procédure exploite alors la valeur de la variable trans-mise, mais peut aussi la modifier. Par défaut (lorsque ces mots clés sont omis), le passage d’un argument se fait par référence.

Dans l’exemple suivant :

Sub MaProcédure(ByVal MaVar) MaVar = MaVar * 100

End Sub

La valeur de la variable passée MaVar est multipliée par 100 dans la procédure MaProcédure, mais la valeur réelle de MaVar étant passée par valeur, sa valeur réelle ne sera pas modifiée.

ParamArray Ce mot clé indique que l’argument est un tableau Optional. L’argument déclaré avec ce mot clé doit être en dernière position dans la liste des arguments et ne peut utiliser conjointement l’un des mots clés précédemment décrits dans ce tableau.

As Type Spécifie le type de données de l’argument passé à la procédure. Il peut s’agir de données de type Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant, ou d’un type défini par l’utilisateur. Une erreur est générée si le type de la variable passée par la procédure appelante est incompatible avec le type déclaré.

L’instruction de déclaration de MaProcédure suivante indique qu’un argument Arg1 de type String (chaîne de caractères) est requis :

Sub MaProcédure(Arg1 As String)

Les différents types de données ainsi que la création de types de données sont étudiés au Chapitre 6.

Chapitre 5 Développer dans Visual Basic Editor 139

Élément Description

= ValeurParDéfaut Indique une valeur par défaut pour l’argument. Ce paramètre ne peut être utilisé que conjointement avec le mot clé Optional. Il permet ainsi de détermi-ner une valeur par défaut qui sera employée si l’argument n’est pas passé par la procédure appelante.

Il peut s’agir d’une constante (valeur numérique, chaîne de caractères ou valeur booléenne) ou d’une expression constante. Une expression renvoyant une valeur variable ne peut être utilisée.

Dans l’exemple suivant, si l’argument Arg1 n’est pas passé par la procédure appelante, sa valeur sera la chaîne "Bonjour".

Sub MaProcédure(Arg1 = "Bonjour")

Le programme suivant illustre l’utilisation du mot clé Static dans une instruction Sub :

Dim MaVar

Sub ProcédureAppelante() MaVar = 2

Call ProcédureStatic(MaVar) Call ProcédureStatic(MaVar) Call ProcédureStatic(MaVar) End Sub

Static Sub ProcédureStatic(MaVar) Dim MaVarStatique

MaVarStatique = MaVarStatique + MaVar MsgBox MaVarStatique

End Sub

La procédure ProcédureAppelante invoque à trois reprises la procédure ProcédureSta­

tic à l’aide de l’instruction Call en lui passant la variable MaVar dont la valeur est 2.

À chaque appel, la procédure ProcédureStatic incrémente la variable MaVarStatique de la valeur de MaVar et affiche sa valeur dans une boîte de dialogue à l’aide de la fonction MsgBox. La procédure appelante reprend alors la main (et invoque à nouveau la procédure ProcédureStatic).

Ce programme affiche donc à trois reprises une boîte de dialogue dont le message est successivement 2, 4, puis 6. En effet, la procédure ProcédureStatic étant déclarée Static, la variable locale MaVarStatique conserve sa valeur entre deux appels. Cette valeur est incrémentée de 2 à chaque exécution de la procédure.

140 Excel et VBA

Une variable est dite locale pour une procédure lorsqu’elle est propre à la procédure, par opposition à une variable publique ou passée par la procédure appelante.

Si vous supprimez l’instruction Static de la déclaration de procédure Static Sub Procé­

dureStatic, la variable MaVarStatique ne conservera plus sa valeur entre les différents appels de procédures, et le programme affichera à trois reprises une boîte de dialogue dont le message sera toujours 2.

Le programme suivant illustre le passage d’un argument par valeur. Les éléments ajoutés par rapport à l’exemple précédent apparaissent en gras :

Dim MaVar

MaVarStatique = MaVarStatique + MaVar MsgBox MaVarStatique

MaVar = 100 End Sub

Ce programme se comporte donc comme nous l’avons détaillé dans l’exemple précédent, mais la procédure ProcédureStatic affecte en plus la valeur 100 à MaVar avant de redon-ner la main à la procédure appelante. Malgré cela, le programme continue d’afficher trois boîtes de dialogue dont le message est successivement 2, 4 et 6. En effet, l’instruction de déclaration de ProcédureStatic spécifie que l’argument MaVar est appelé par valeur (ByVal), et non par adresse. La valeur de MaVar est donc exploitée, mais sa valeur réelle ne peut être modifiée. MaVar reprend donc sa valeur initiale dès que la procédure appelante reprend la main.

Supprimez le mot clé ByVal dans l’instruction de déclaration de ProcédureStatic. L’argument MaVar est maintenant passé par adresse et sa valeur peut donc être modifiée.

Le programme ainsi modifié affiche trois boîtes de dialogue dont le message est successi-vement 2, 102 et 202, reflétant ainsi la modification de la valeur de MaVar effective lors des deuxième et troisième exécutions de la procédure ProcédureStatic.

Définition

Chapitre 5 Développer dans Visual Basic Editor 141

Dans le document VBA et Excel (Page 147-152)