Un programme VBA manipule des valeurs. Ces valeurs peuvent prendre pluiseurs formes, chacune d'entre elle devant respecter des règles.
Un littéral est une valeur explicitement tapée dans le programme.
Un littéral texte est entre guillemets:
Un littéral date ou heure est entre croisillons #:
Un littéral numérique est un nombre:
Attention: en VBA, le séparateur décimal est toujours le point (.), jamais la virgule (,), peu importe la façon dont est configuré Excel. Pour le passage de valeurs décimales entre les deux programmes, la conversion se fait automatiquement.
2,5 n'est donc JAMAIS une valeur numérique en VBA.
Une constante est un littéral auquel on donne un nom:
Une constante doit être déclarée et initialisée.
Par exemple, dans l'instruction
Const cDouzaine = 12
La valeur d'une constante NE PEUT PAS être modifiée lors de l'exécution du programme. On utilise donc les constantes pour donner un nom à des valeurs qui ne changent pas, comme le nombre d'objets dans une douzaine, la valeur de Pi, le nombre de secondes dans une journée.
VBA contient plusieurs constantes intrinsèques qui nomment des valeurs spécifiques à VBA.
Par exemple, vbRed vaut 255.
Les constantes intrinsèques sont automatiquement déclarées et initialisées par VBA. Pour en consulter la liste, utilisez l'explorateur d'objets:
1) Critère de recherche dans les bibliothèques d'objets
VBA.
2) Liste des bibliothèques d'objets répondant au critère. 3) Classes d'objets dans la bibliothèque choisie en 2). 4) Objets de la classe choisie en 3). 5) Valeur de l'objet choisi en 4). |
|
Vous pouvez aussi consulter l'aide VBA (recherchez Constantes).
Pour déclarer et initialiser vos constantes, utilisez l'instruction CONST
[Public | Private]
Const nom [As type] =
expression Où
|
Les littéraux et les constantes ont des valeurs fixes pendant toute l'exécution d'un programme VBA.
Un programme VBA ne peut pas changer la valeur d'une constante.
Les valeurs modifiables par le programme se trouvent dans des variables ou dans des propriétés d'objet.
Les variables sont des unités de stockage internes au programme VBA, alors que les propriétés d'objet sont des unités de stockage externes.
Par exemple, si votre programme doit compter le nombre de cellules jaunes
d'une plage, il utilisera une variable.
Mais s'il veut changer la couleur d'une cellule, il utilisera la propriété color
de l'objet de la classe Range contenant la cellule.
Lors de l'évaluation d'une expression (pendant exécution du programme), le nom de chaque variable est remplacé par son contenu.
Une variable est caractérisée par son nom et son type.
Un nom de variable VBA doit:
Un nom de variable peut
Un nom de variable ne doit pas
Le choix de noms en programmation fait l'objet de plusieurs pratiques et conventions (voir
http://fr.wikipedia.org/wiki/Convention_de_nommage).
Dans le présent document, on a adopté la pratique de
Un des avantages de cette pratique se manifeste lorsqu'on utiliser la fonctionnalité Compléter le mot de VBE. En effet:
Comme il n'y a qu'un seul objet dont le nom commence par sN qui est valide à cet endroit, taper sN suivi de
+ complète le nom de la variable sans effort.
Il n'y a donc pas de problème à utiliser des noms très descriptifs (et longs), en autant que les premières lettres les distinguent de noms d'autres objets.
Dans ce contexte, il faut particulièrement éviter les nom de variable d'une seule lettre, qui n'ont aucune valeur descriptive, sauf les variables i, j et k utilisés dans la manipulation de tables, matrices et collections.
Une variable VBA doit être déclarée pour que VBA lui réserve un espace en mémoire centrale et lui assigne un nom. La quantité et l'organisation de l'espace réservé dépend du type de variable.
Si Option Explicit n'est pas présent au début du module VBA où se trouve une variable, et que la variable n'est pas déclarée, VBA la déclarera automatiquement de type Variant, qui peut contenir n'importe quoi.
Apparemment pratique, cette fonctionnalité est très dangereuse, car elle désactive la détection de fautes de frappe.
En effet VBA ne détectera pas d'erreur dans le code suivant:
Sub Exemple() Dim cCompteur As Currency cComteur = cCompteur + 10 End Sub |
Mais la détectera si vous faites plutôt:
Option Explicit Sub Exemple() Dim cCompteur As Currency cComteur = cCompteur + 10 End Sub |
Pour automatiser l'insertion de Option Explicit au début de chaque module:
Voir les modifications recommandées à l'interface VBE:
Une variable est explicitement déclarée dans les instructions Dim, Private, Public, Function et Sub.
Dim nom[([indices])]
[As [New] type] [, nom[([indices])]
[As [New] type]] . . . Private nom[([indices])] [As [New] type] [, nom[([indices])] [As [New] type]] . . . Public nom[([indices])] [As [New] type] [, nom[([indices])] [As [New] type]] . . . où
Dim peut être utilisé:
Les valeurs numériques sont initialisées à 0, les valeurs texte à "", les dates à #00:00:00#, les variant à Empty et les objets à Nothing. |
Noter que l'instruction Dim utilisée à l'intérieur d'une procédure Sub ou Function initialise toujours la valeur de la variable à sa valeur par défaut, peu importe l'endroit où se trouve Dim danbs la procédure.
Autrement dit, la valeur des variables déclarées dans une procédure sont perdues dès que la procédure est terminée.
Les instructions Private et Public ont la même syntaxe que Dim, mais ils ont une portée différente.
Les instructions Function et Sub permettent aussi de déclarer des variables, qui seront les paramètres de la procédure.
Type de données |
Description |
Plage |
Valeur initiale |
Suffixe (utilisation déconseillée) |
---|---|---|---|---|
Byte | Un octet | 0 à 255 | 0 | |
Boolean | Vrai ou faux, Oui ou Non | True ou False | False | |
Integer | Un nombre entier | -32 768 à 32 767 | 0 | % |
Long | Un nombre entier | -2 147 483 648 à 2 147 483 647 |
0 | & |
LongLong | Un nombre entier. Ce type n'est disponible que depuis Office 2010 et uniquement dans les versions 64 bits. | -9,223,372,036,854,775,808 à 9,223,372,036,854,775,807 |
0 | ^ |
Single | Un nombre pouvant contenir une partie décimale. La valeur peut être une approximation de la valeur assignée. | -3,402823E38 à -1,401298E-45 pour les valeurs
négatives ; 1,401298E-45 à 3,402823E38 pour les valeurs positives |
0 | ! |
Double | Un nombre pouvant contenir une partie
décimale. La valeur peut être une approximation de la valeur assignée.
|
-1,79769313486231E308 à -4,94065645841247E-324 pour les valeurs négatives ; 4,94065645841247E-324 à 1,79769313486232E308 pour les valeurs positives |
0 | # |
Currency | Un nombre pouvant contenir jusqu'à 4 chiffre
en partie décimale.
|
-922 337 203 685 477,5808 à 922 337 203 685 477,5807 |
0 | @ |
Date | Une date et une heure | 1er janvier 100 au 31 décembre 9999 | #00:00:00# | |
Object | Toute référence à des données de type Object | Nothing | ||
String | Du texte | 0 à environ 2 milliards de caractères | "" ou vbNullString | $ |
Variant |
Le type indéfini. VBA détermine le type du contenu d'une variable Variant lorsque le programme lui assigne une valeur. | Empty | ||
Type défini par l'utilisateur | Type défini par l'utilisateur. Voir DefType dans l'aide VBA |
VBA offre une grande gamme de types de données, pour être compatible avec des programmes
écrits dans des versions antérieures du langage.
En pratique, évitez d'utiliser les types:
Donc, pour stocker
Vous devrez utiliser les autres types lorsqu'ils sont utilisés dans des programmes existants ou dans les propriétés d'objets.
Dans le cas particulier des paramètres
de Function ou
Sub paramétré, il est préférable de les
déclarer Variant puis de valider le contenu dans la procédure.
On évite ainsi des messages d'erreur déroutants lorsque les paramètres sont
mal initialisés. On verra dans la section Tests et
branchements comment
gérer ces paramètres.
En plus des valeurs "normales", comme du texte dans une variable String, un nombre dans une variable Currency, les variables peuvent avoir des valeurs "spéciales" dans des situations "spéciales".
Empty: une variable de type Variant est initialisée à Empty lors de sa création.
"" (vbNullString ou vbNullChar): une valeur de type String vide.
Null: une variable Null n'existe pas. Aucun espace mémoire ne lui a été assigné. Seul son nom existe. S'applique le plus souvent à des propriétés d'objets.
Nothing: lorsqu'une variable objet est déclarée mais pas assignée (avec SET). Ne s'applique qu'aux variables objet. Pas aux propriétés d'objet, pas aux variables VBA.
VBA convertit automatiquement les valeurs de types différents au besoin. Il n'est donc pas nécessaire de s'assurer que toutes les variables soient du même type avant de les utiliser dans une expression. Il arrive cependant que VBA convertisse tout en entier, ce qui peut mener à la perte de décimales. Il est donc préférable d'utiliser le type currency pour toutes les variables qui s'y prêtent, soit en pratique toutes les variables numériques de vos programmes.
Le code VBA à droite fonctionne, car VBA convertit S10 en entier avant de l'ajouter à 1 et mettre le résultat dans cCompteur. | Sub Exemple() Dim cCompteur As Currency Dim s10 As String s10 = "10" cCompteur = s10 + 1 End Sub |
Mais le code à droite ne fonctionnera pas et se terminera par un message d'erreur "Incompatibilité de type" | Sub Exemple() Dim cCompteur As Currency Dim s10 As String s10 = "dix" cCompteur = s10 + 1 End Sub |
Il n'est pas prudent de se fier à la conversion automatique de types de VBA. Si elle fonctionne PRESQUE tout le temps, il arrive que des données imprévues donnent des résultats inattendus.
VBA fournit donc des Fonctions de conversion: Val(), Str(), Format(), FormatCurrency(), FormatDateTime(), CBool(), CByte(), CCur(), CDate(), CDbl(), CDec(), CInt(), CLng(), CSng(), CStr(), CVar()
Val(expression) expression peut être n'importe quelle expression de type string. Val() tente d'extraire un nombre de l'expression. Val() est l'opposé de Str().
Où
Point décimal: Val() ne reconnaît que le point comme séparateur décimal. Si vous voulez permettre l'utilisation d'un autre symbole (comme la virgule) vous devrez utiliser l'instruction Replace() au préalable ou utiliser Ccur() pour faire la conversion. |
Str(expression) expression peut être n'importe quelle expression sauf de type string Str(expression) convertit en string le contenu de expression. Str() est l'opposé de Val(). Le format est choisi par VBA et peut ne pas convenir (séparateur de
décimales, format de date ou d'heure...). |
Format(expression[, format[, premierjour[, premièresemaine]]]) où
format peut être
|
FormatCurrency(Expression[,NombreDécimales[,ZéroNonSignificatif[,Parenthèses[,Groupes]]]]) FormatNumber(Expression[,NombreDécimales[,ZéroNonSignificatif[,Parenthèses[,Groupes]]]]) FormatPercent(Expression[,NombreDécimales[,ZéroNonSignificatif[,Parenthèses[,Groupes]]]]) Où:
Ces deux fonctions convertissent Expression en format String en utilisant les paramètres de présentation des paramètres régionaux de Windows. |
FormatDateTime(Expression[,Format]) Où
Cette fonction convertit Expression en format String en utilisant les paramètres de présentation des paramètres régionaux de Windows. |
CBool(expression) Où
Ces fonctions convertissent explicitement expression dans le
type indiqué par le nom de la fonction. Si la conversion est impossible,
comme dans Voir la section Gestion des erreurs pour une technique permettant de contourner le problème potentiel. |
En principe, une variable déclarée dans une procédure Sub ou une procédure Function ne peut être utilisée que dans cette procédure:
Ici, cMontant est une variable locale
|
Sub Exemple2() Dim cMontant As Currency InputBox cMontant End Sub |
Une variable déclarée au début d'un module (avant la première procédure) peut être utilisée dans toutes les procédures du module:
Ici, cMontant3 est une variable locale du module |
Dim cMontant3 as currency Sub Exemple3() InputBox cMontant3 End Sub Sub AutreSub() cMontant3 = cMontant3 + 10 End Sub |
Pour qu'une variable puisse être utilisée par toutes les procédures de tous les modules, il faut la déclarer en utilisant l'instruction Public au lieu de l'instruction Dim.
Il est aussi possible d'éviter qu'une variable locale perde sa valeur à la fin de l'exécution de la procédure dont elle fait partie en utilisant l'instruction Static au lieu de Dim. Il est préférable de stocker ces valeurs dans des cellules Excel.
Recommandation: n'utilisez que des variables locales de procédure. Utilisez les paramètres de Sub ou de Function ou, mieux encore, des cellules Excel pour partager des valeurs entre les procédures et les modules.
À la fin de l'exécution de la procédure Sub Principale ci-contre, la variable cTaux contiendra 0.15. |
Option Explicit Dim cTaux As Currency Sub Principale() cTaux = 0.05 Call NouveauTaux MsgBox cTaux End Sub Sub NouveauTaux() cTaux = 0.15 End Sub |
À la fin de l'exécution de la procédure Sub Principale2 ci-contre, la variable cTaux contiendra 0.05. |
Option Explicit Sub Principale2() Dim cTaux As Currency cTaux = 0.05 Call NouveauTaux2 MsgBox cTaux End Sub Sub NouveauTaux2() Dim cTaux As Currency cTaux = 0.15 End Sub
|
La procédure Sub ci-contre affiche successivement: 2 3.00 3
Alors que si t1 et t2 sont déclarés Currency, 3 3.00 3 |
Sub
sDivision() Dim Taux1 As Double Dim Taux2 As Double Taux1 = 0.15 Taux2 = 0.05
MsgBox Int(Taux1 /
Taux2) |
Dans cette section nous avons présenté le mode d'emploi suivant:
Le fichier Excel Tutoriel Exemples Déclarations.xlsm contient les exemples présentés dans la présente section.