Auteur:
Michel
Berthiaume
Reproduction interdite sans autorisation
Un programme VBA manipule des valeurs.
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:
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'objets 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, 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 peut
Un nom de variable ne doit pas
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:
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. |
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 | & |
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 variable 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]]]]) 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 Exemple() 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, cMontant est une variable locale du module |
Option explicit Dim cMontant Sub Exemple() InputBox cMontant End Sub Sub AutreSub() cMontant = cMontant + 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.
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 le 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 Principale ci-contre, la variable cTaux contiendra 0.05. |
Option Explicit Sub Principale() Dim cTaux As Currency cTaux = 0.05 Call NouveauTaux MsgBox cTaux End Sub Sub NouveauTaux() 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) |