Après une longue introduction aux notions fondamentales de la POO, il est temps d'explorer les contrées sombres du VBA. Nous commencerons par les variables. Si vous connaissez d'autres langages de programmation, vous savez à quel point elles sont importantes. On les retrouve partout ! Mais bon, nous partons de zér0, donc vous ne savez pas ce que c'est. N'oubliez pas que les variables sont fondamentales, aussi deux chapitres y seront consacrés. Ne brûlez pas les étapes et allez-y doucement.
- Qu'est ce qu'une variable ?
- Comment créer une variable ?
- Que contient ma variable ?
- Types de variables
Qu'est ce qu'une variable ?
Pour faire un programme, on a besoin de stocker des informations pendant un certain temps pour ensuite le réutiliser. Pour cela, on va utiliser un espace de stockage pour stocker l'information que l'on souhaite retenir.
Pour vous aider je vous donne un exemple : on demande à l'utilisateur d'entrer son prénom et on va le stocker dans une variable prenom. Par la suite, dans l'exécution du programme, on fera référence à la variable prenom pour afficher son prénom. Sachant que le prénom est différent selon l'utilisateur et que nous pouvons lui demander de changer de prénom, on appelle cette notion variable puisqu'elle peut changer au cours du temps.
Pour stocker une variable, on va avoir besoin d'un espace de stockage que l'on demande à l'application. Elle ne refusera jamais sauf s'il n'y en a plus, mais c'est très rare. En revanche, on ne va pas demander n'importe quel espace. Pour stocker du texte, on demande une variable de type "texte" et pour un nombre une variable de type "nombre". De ce fait, si vous essayez de stocker un nombre dans une variable texte, l'exécution ne se fera pas correctement. Nous allons étudier les différents types plus tard dans ce chapitre.
Comment créer une variable ?
Nous savons maintenant ce qu'est une variable. Il est temps d'apprendre à les créer ! On parle alors de déclaration de variable. Il existe deux méthodes de déclaration : explicite et implicite. Étudions les deux méthodes.
Déclaration explicite
La déclaration de variable explicite est très simple, voici la syntaxe :
1 | Dim ma_variable_explicite [As type] |
Étudions ce bout de code. Pour déclarer une variable, on écrit en premier Dim. Vient ensuite le nom de notre variable qu'il faut un minimum explicite, mais pas non plus une phrase. Enfin, le type de la variable. Il est ici entre crochets puisqu'il n'est pas obligatoire. S'il n'est pas indiqué, la variable est de type Variant par défaut (nous allons voir les différents types ultérieurement).
Revenons sur le nom de la variable. Une variable que vous appelleriez x n'est pas explicite et difficile à repérer dans un programme. Vous savez peut-être que c'est un nombre, mais si vous revenez sur votre programme par la suite, la signification vous aura peut-être échappée. Dans l'extrême inverse, on a aussi une variable appelée nombre_le_plus_grand_de_toute_la_serie. C'est certain qu'il est explicite, par contre, il ne faudra pas se tromper lorsque vous avez à y faire référence. Plus il y a de caractère et plus la probabilité de se tromper est grande. S'il y a un seul caractère différent, le programme ne reconnaitra pas la variable. Autrement dit, les noms du genre :
1 2 3 | Dim temp Dim data Dim x |
sont à proscrire absolument.
Il y a des règles à respecter lorsque vous déclarez une variable :
- Elle doit commencer par une lettre
- Elle ne doit contenir que des lettres, des chiffres et le caractère de soulignement, aussi nommé underscore (touche 8 du clavier azerty français _). Les espaces sont interdits !
- Elle est limitée à 40 caractères.
- Elle ne doit pas être identique à un mot réservé.
Qu'est ce que la liste des mots réservés ?
Cette liste contient tous les mots réservés au bon fonctionnement de VBA, c'est-à-dire les mots-clés du langage. Dim en est par exemple un puisqu'il sert à déclarer une variable. On ne peut pas non plus attribuer à une variable le nom Sub. Ce mot est réservé pour déclarer les procédures. C'est la même chose avec les noms de fonctions et tous les mots réservés à VBA. Si vous ne savez pas s'il est réservé, un message d'erreur apparait lors du codage, il suffit alors de choisir un autre nom.
On peut ensuite attribuer une valeur à notre variable :
1 | ma_variable_explicite = 10 |
Déclaration implicite
La déclaration de variable explicite était simple, l'implicite l'est encore plus ! Voici la syntaxe :
1 | ma_variable_implicite = 6 |
Vous avez compris le truc ? Et bien, la variable est utilisée directement. Elle n'a pas été déclarée avec Dim. Le programme demande automatiquement de créer cette variable, qui sera par défaut de type Variant et aura pour valeur 6.
Cette approche peut poser problème et engendrer des erreurs difficiles à détecter si vous n'orthographiez pas correctement le nom de la variable dans une commande ultérieure du programme.
Par exemple, si dans la suite de votre programme vous faites référence à ma_variabl_implicite au lieu de ma_variable_implicite, vous savez ce que cela signifie, mais VBA l'ignore. Il va supposer que ma_variabl_implicite est une nouvelle variable et la créé en tant que telle. L'ancienne variable, ma_variable_implicite, est toujours là, mais elle n'est plus utilisée. Vous avez à présent deux variables différentes alors que vous pensez n'en avoir qu'une seule. Cela peut causer d'énormes problèmes qui peuvent prendre beaucoup de temps à être résolus.
Quelle méthode de déclaration choisir ?
Là, c'est à vous de voir. Il y a des avantages et inconvénients dans les deux types. La méthode à utiliser dépend de vos préférences personnelles. Le codage est souvent plus rapide en utilisant la déclaration implicite parce que vous n'avez pas à définir à l'avance vos variables avant de les utiliser. Vous utilisez des variables dans les commandes et VBA s'occupe du reste. Cependant, comme nous l'avons vu, cela peut engendrer des erreurs à moins que vous ne possédiez une très bonne mémoire et sachiez exactement ce que vous faites. Une déclaration implicite peut aussi rendre votre code plus difficile à comprendre pour les autres.
Obliger à déclarer
Si vous utilisez les deux méthodes, vous pouvez vous obliger à déclarer votre variable grâce à la fonction Option Explicit
. Cela permet de ne jamais déclarer une variable de façon implicite. De cette manière, une variable non déclarée dans un code provoque une erreur dans la compilation du code et vous indique directement quelle variable est mal orthographiée ou non déclarée à cause d'un oubli.
Pour utiliser cette fonction, il faut l'introduire dans TOUS les modules dans lesquels vous souhaitez obliger les déclarations de variables, et ce, avant le code des procédures. Si vous regardez un module dans la fenêtre de l'éditeur Visual Basic, vous verrez une liste déroulante appelée (Général) dans le coin supérieur gauche de la fenêtre du module et une liste déroulante appelée (Déclarations) dans le coin supérieur droit de la fenêtre du module. Cliquez sur (Déclarations) et vous irez directement dans la section des déclarations. Saisissez la commande suivante :
1 | Option Explicit |
Après avoir saisi cette commande, une ligne se place en dessous pour confirmer la présence de la fonction. Maintenant, chaque variable doit être déclarée. Essayez par vous-même d'exécuter un code sans déclarer une variable, une erreur arrêtera la compilation.
Que contient ma variable ?
Vous savez maintenant déclarer une variable et lui attribuer une valeur. Mais comment retrouver la valeur de cette variable et l'afficher à l'écran pour vérifier ? Pour cela, on va utiliser la fonction MsgBox. Cette fonction permet d'afficher ce que l'on veut sous forme d'une fenêtre qui s'ouvre dans le classeur concerné et qui bloque temporairement l'exécution de la procédure. Pour continuer la procédure, il faut cliquer sur "Ok".
Cette fonction sera utilisée abondamment dans la suite du cours. C'est pour ça que l'on va l'étudier ici.
Lorsque vous écrivez du code dans l'éditeur, vous pouvez exécuter ce code soit à l'aide de l'icône dans la barre d'outils ou en pressant la touche F5. Le code s'exécute alors dans le classeur actif. Dans notre cas, la boite de message (MsgBox) va s'ouvrir dans le classeur actif. Voici un exemple de boite de dialogue :
Pour afficher ce message, le code est très simple !
1 2 3 4 5 | Sub bonjour() MsgBox "Bonjour" End Sub |
Cette syntaxe est nouvelle pour vous. Nous aurons l'occasion de reparler des fonctions plus loin dans le cours. Faîtes-moi confiance pour le moment et contenez-vous d'avaler cette histoire de MsgBox comme une recette de cuisine.
A noter que tant que vous ne cliquez pas sur Ok pour terminer l'exécution du code, vous ne pouvez modifier votre code.
Je ne sais pas si vous avez fait votre feignant comme moi, mais si vous ne mettez pas les majuscules à MsgBox, VBA s'en charge ! C'est le cas pour Dim aussi, mais aussi pour toutes les fonctions qui sont présentes dans VBA. Tout le monde le dit, les programmeurs sont des feignants ! Ou pas…
Et pour afficher la valeur d'une variable alors ?
Pour afficher la valeur d'une variable, on va simplement attribuer à la fonction notre variable.
1 | MsgBox ma_variable |
Il n'y a pas besoin de mettre des guillemets, ceux-ci servent pour afficher du texte. Si vous en mettez autour de votre variable, la fonction affiche le nom de votre variable et non la valeur de celle-ci.
1 2 3 4 5 6 7 8 9 10 | Sub test() Dim ma_variable As String ma_variable = "Bonjour" MsgBox "Cette phrase affiche la valeur de ma variable : " & ma_variable MsgBox "Cette phrase affiche le nom de ma variable : " & "ma_variable" End Sub |
Ce code affiche dans un premier temps :
Puis dans une seconde boite de message :
Vous remarquez que pour mettre du texte et une variable dans la même phrase, vous pouvez concaténer les deux chaînes de caractères. Concaténer signifie mettre bout à bout. Pour cela on utilise le et commercial &. Il doit être présent à chaque fois que deux éléments différents sont adjacents. Un élément peut être une chaîne de caractère entre guillemets ou une variable.
C'est tout ce que je voulais vous faire découvrir sur cette fonction qui est très utilisée. On verra dans la suite du cours que l'on peut personnaliser ces boites de dialogue.
Types de variables
Un type de données peut être attribué à une variable ce qui permet de déterminer le type d'information que la variable peut stocker. Cette décision peut avoir un effet sur l'efficacité de votre code. Si aucun type de données n'est spécifié, le type par défaut est Variant.
On rappelle que pour attribuer un type à une variable, il faut faire suivre le type lors de la déclaration de variable.
1 | Dim ma_variable As String |
Variant
Une variable de type Variant peut stocker tous les types de données, par exemple, du texte, des nombres, des dates ou bien encore d'autres informations. Elle peut même stocker un tableau entier. Une variable Variant peut modifier librement son type pendant l'exécution du code alors que ceci est impossible à réaliser avec un autre type de données (par exemple String). Vous pouvez utiliser la fonction VarType pour trouver le type de données que contient une variable Variant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub TestVariables() ' On déclare implicitement une variable qui est du texte. ma_variable = "le_site_du_zéro" 'On affiche le type de la variable MsgBox VarType(ma_variable) 'On change la valeur de la variable pour mettre un nombre ma_variable = 4 'On affiche le nouveau type de la même variable MsgBox VarType(ma_variable) End Sub |
La boite de dialogue affichera d'abord la valeur 8 puis la valeur 2.
Mais, je croyais que la fonction nous renvoyait le type de la variable ?
C'est le cas, sauf qu’au lieu de vous le donnez en toutes lettres. On vous donne un chiffre qui correspond à un type. Voilà le tableau des correspondances :
Valeur de retour |
Type |
---|---|
0 |
Empty |
1 |
Null |
2 |
Integer |
3 |
Long |
4 |
Single |
5 |
Double |
6 |
Currency |
7 |
Date/Time |
8 |
String |
Par la même occasion, je viens de vous présenter la liste de tous les types de variables que l'on peut renvoyer pour une variable.
Même si Variant stocke tout type de données, il n'est pas indifférent à ce qu'il contient. En effet, vous avez vu dans l'exemple précédant que Varient identifie le type de données. Ainsi, si vous essayez d'effectuer des calculs avec une variable de type Variant mais contenant du texte, une erreur apparait. Il existe une fonction pour savoir si la variable est de type numérique ou non et donc ainsi faire des calculs. Cette fonction est IsNumeric et fonctionne comme la fonction VarType. Si la variable comprend un nombre, la fonction renvoie Vrai, sinon elle renvoie Faux.
1 2 3 4 5 6 7 8 9 | Sub TestNumeric() 'On déclare une variable implicitement ayant du texte ma_variable = "zozor" 'On affiche le résultat de la fonction MsgBox IsNumeric(ma_variable) End Sub |
Cet exemple affiche la valeur Faux.
Reprenons la liste des types de variables que nous avons vues dans le tableau précédent. Il y a en fait des types qui peuvent se regrouper. On va détailler ces différents types et dire à quoi ils servent.
Les types numériques
On va ici détailler les types numériques : Byte, Integer, Long, Single, Double, Currency. Tous ces types de variables permettent de stocker des nombres.
Pourquoi avoir créé autant de types sachant qu'un nombre est un nombre non ?
Il est vrai qu'on pourrait avoir un seul type pour les nombres. Mais le chiffre 1 ne prend pas la même place en mémoire que le nombre 23954959,45593. C'est pour cela que différents types ont été créés. En effet, si la mémoire monopolisée par une variable est faible, alors le programme tournera plus vite. C'est logique après tout, il aura moins de données à analyser.
Voici un tableau qui récapitule les différents types numériques (la plage représente la plage de dispersion dans laquelle les valeurs de la variable doivent être comprises) :
Nom |
Description |
Plage |
Caractère de déclaration |
---|---|---|---|
Byte |
Contient un nombre entier (sans partie décimale = nombre après la virgule) sur 1 octet |
0 à 255 |
Aucun |
Integer |
Contient un nombre entier sur 2 octets |
-32 768 à 32 767 |
% |
Long |
Idem Integer sur 4 octets |
|
& |
Single |
Contient un nombre en virgule flottant (partie décimale variable) sur 4 octets |
-3,402823E38 à 1,401298E-45 (valeurs négatives) 1,401298E-45 à 3,402823E38 (valeurs positives) |
! |
Double |
Idem Single sur 8 octets |
-1,79769313486232E308 à -4,94065645841247E-324 (valeurs négatives) 4,94065645841247D-324 à 1,79769313486232D308 (valeurs positives) |
|
Currency |
Nombre sur 8 octets avec une partie décimale fixe |
-922337203685477,5808 à 922337203685477,5807 |
@ |
Oulala, c'est quoi tous ces chiffres ?
J'avoue que tous ces chiffres ne sont pas très digestes. Il faut simplement retenir que pour de petits entiers on utilise Integer ou Byte si l'on est sûr que c’est un petit nombre (comme pour l'age par exemple). Si on sait que l'entier sera très gros, on utilise Long. C'est la même chose pour Single et Double mais pour les nombres décimaux. Currency est moins souvent utilisé.
Euh, j'ai dû partir aux toilettes quand tu as expliqué le caractère de déclaration…
Non, c'est normal, je n'en ai pas parlé. J'allais y venir. Le caractère de déclaration est utilisé pour faciliter les déclarations de variable. Au lieu de mettre As Integer, on va simplement coller le caractère % à la variable pour la déclarer comme un Integer.
1 2 3 4 5 6 7 8 9 10 11 | 'Ces deux lignes exécutent la même chose Dim ma_variable% Dim ma_variable As Integer 'D'autres exemples de déclaration de variables Dim age As Byte Dim annee As Integer Dim salaire_Zidane As Long Dim un_pourcentage As Currency Dim une_fraction As Single Dim une_grosse_fraction As Double |
le caractère de déclaration permet donc de gagner du temps dans le codage, mais n'est pas très explicite. Je ne peux vous conseiller une méthode, c'est selon votre façon de programmer.
On peut déclarer plusieurs variables sur une même ligne (avec un seul Dim. Mais pour le type, il faut le spécifier à chaque fois. S'il n'est pas spécifié après chaque variable, le type Variant est appliqué aux variables sans type spécifique.
1 | Dim nom As String, prenom As String, age As Integer, enfants As Integer |
Dans le tableau répertoriant les valeurs renvoyées par VarType, il n'y a pas le type Byte. Si une variable est de type Byte, la fonction renvoie 17.
Le type String
Si vous savez que votre variable ne sera que du texte, alors vous utilisez le type String. String signifie en anglais "Chaîne". C'est donc une chaîne de caractère que l'on va donner comme valeur.
1 | Dim mon_texte As String |
Ainsi, vous pouvez utiliser les fonctions sur les chaînes de caractères à ces variables.
Par défaut, la longueur de la chaîne de caractère est variable. On peut alors, pour économiser de la mémoire, fixer la longueur de la chaîne à un maximum. C'est au moment de la déclaration de variable que l'on effectue cette opération de cette façon :
1 | Dim du_texte As String * 50 |
On utilise l'étoile (le signe multiplier informatique) suivie du nombre de caractères maximum. Dans notre exemple, la chaîne ne pourra dépasser 50 caractères.
Si la chaîne est inférieure au maximum, elle est comblée avec des espaces. A l'inverse, si elle est trop longue, elle est coupée après le 50ème caractère et le reste est perdu.
Il existe aussi un caractère de déclaration pour ce type de variable qui est le dollar \$.
A titre indicatif, une chaîne de longueur fixe peut comporter jusqu'à 65 500 caractères alors qu'une chaîne de longueur variable peut comporter jusqu'à 2 000 000 de caractères.
Les types Empty et Null
Vous avez vu dans le tableau des différents types qu'il reste encore des types inconnus. Nous allons en analyser deux de plus ici, il s'agit de Empty et Null. Le premier cité est attribué à une variable ne contenant rien. C'est le cas d'une variable qui est déclarée et à laquelle n'est affectée aucune valeur. On peut vérifier si une variable contient quelque chose ou si elle a été définie avec un type grâce à la fonction IsEmpty.
1 2 3 4 5 6 7 8 9 10 11 12 | ' On déclare une variable sans type donc un Variant Dim ma_variable_vide ' On déclare une variable de type String (du texte) Dim mon_texte As String ' On n'affecte aucune valeur ni à l'une ni à l'autre variable ' On affiche le type des deux variables MsgBox VarType(ma_variable_vide) MsgBox VarType(mon_texte) |
Dans un premier temps, on observe que la variable est vide donc s'affiche 0. Dans le second temps, la variable a beau être vide, mais elle est déclarée comme une chaîne de caractère, s'affiche alors 8 pour String.
Il ne faut pas confondre une valeur vide à une valeur Null. C'est le deuxième type de variable expliqué dans ce point. Une variable Varient peut contenir une valeur spéciale appelée Null. La valeur Null est utilisée pour indiquer des données inconnues ou manquantes. Les variables ne sont pas initialisées à Null à moins que vous n'écriviez du code pour ce faire. Si vous n'utilisez pas Null dans votre application, vous n'avez pas à vous soucier de la valeur Null.
La valeur Null n'est pas égale à 0.
Il existe une fonction pour savoir si une variable est de type Null ou non, il s'agit de la fonction IsNull.
1 2 3 4 5 6 7 8 9 | Sub TestNull() ' On crée une variable à laquelle on attribue la valeur Null (sans guillemet) ma_variable = Null ' On teste le type de la variable MsgBox IsNull(ma_variable) End Sub |
Voilà deux types de variables en plus dans votre besace.
Le type Date et Heure
On ne peut définir une variable avec le type Date dès la déclaration. Elle se "transforme" en type Date une fois que la valeur est égale à une date. Les dates et heures sont stockées sous forment de nombres en virgule flottante. La partie entière représente le nombre de jours écoulés depuis le 31 décembre 1899. La partie décimale représente les heures, minute et secondes exprimées comme une portion de 24 heures (0,5 = 12 heures).
Il existe une fonction permettant de savoir si la valeur d'une variable est une date. C'est la fonction IsDate.
1 2 | la_date = "23-07-2010" MsgBox IsDate(la_date) |
Ce code affiche Vrai.
La date peut être renseignée avec différents séparateurs. Ici j'ai utilisé les tirets, mais on peut utiliser les points ou les slashs. L'année peut comporter que deux chiffres. Il faut faire attention à la configuration du format de date qui peut faire varier la reconnaissance de date. JJ-MM-AAAA ou MM-JJ-AAAA.
Le type Booléens
Vous savez ce qu'est un booléen ? Ce mot un peu barbare désigne en fait un type de variable qui prend 2 valeurs différentes : Vrai et Faux. L'avantage est que ce type de variable ne demande que 2 octets pour être stocké et très souvent utilisé en programmation. VBA utilise l'anglais, la variable de type booléen prends alors les valeurs True or False. Par contre, à l'affiche dans une boite de dialogue, Vrai et Faux sont affichés.
1 2 3 4 5 | ' Une variable qui vaut Vrai ma_variable = True ' Une variable qui vaut Faux ma_variable = False |
La fonction VarType renvoie 11 quand la variable est un booléen.
Le type Objet
Ce sont des variables faisant référence à des objets. Ne me dites pas que vous avez oublié ce que c'est… Ce sont les classeurs, les feuilles, les cellules ou même l'application. On a vu dans le cours qu'avec la fonction With… End With on peut faire les faignants et ne pas tous réécrire. Et bien là, on va pouvoir mettre des objets en tant que variable. Ce type de variable occupe 4 octets. L'instruction Set permet d'attribuer une référence d'objet à la variable. Par contre, ce type de variable prend de la place et on libère donc la mémoire grâce à Nothing (cf. exemple ci-dessous).
Les exemples sont plus explicites que le texte :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Sub test() ' On crée une variable qui a pour type une feuille. ' De ce fait, on peut lui attribuer une valeur spécifique : une feuille d'un classeur. Dim Ws As Worksheet ' On attribue la 1ere feuille du classeur dans la variable grâce à Set Set Ws = Sheets(1) ' On affiche le nom de la première feuille MsgBox Ws.Name ' On libère ensuite la mémoire Set Ws = Nothing End Sub |
Ceci est réalisable avec une feuille ou un classeur ou une cellule. En combinant tout ça, on obtient ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 | ' On attribue des variables : c comme classeur pour Workbook. ' f comme feuille pour Worksheet. Dim c As Workbook, f As Worksheet ' On associe à c le premier classeur Set c = Workbooks("classeur1") ' On associe à f la feuille 1 du classeur 1 Set f = c.Worksheets("feuil1") ' On affiche la valeur de la première cellule de la première feuille, ' du premier classeur MsgBox f.Range("A1").Value |
On aurait pu aussi associer Range("A1") à une variable pour raccourcir le code si on avait à l'utiliser souvent. Ce code est utile et remplace ce code :
1 | Workbooks("classeur1").Worksheets("feuil1").Range("A1").Value |
Ce que nous avons fait avant peut paraitre plus long, mais très pratique par la suite, en effet, la simple lettre f remplace tout ce code :
1 | Workbooks("classeur1").Worksheets("feuil1") |
Voilà, vous connaissez la base sur les variables. Vous pensiez que c'était assez ? Eh bien pas tout à fait, c'est pour ça que l'on a décidé de refaire un chapitre sur les variables ! Ce n'est pas pour nous répéter ne vous inquiétez pas, c'est évidement pour apporter encore plus de connaissances et continuer votre route vers les beaux programmes VBA !