Tester l'initialisation d'une variable en VBA
par
, 16/08/2020 à 12h47 (3299 Affichages)
Objectif : être capable de tester l'initialisation d'une variable en VBA, puis d'appliquer cette méthode pour vérifier si un élément est présent dans une collection.
I. Tester l'initialisation d'une variable de type Variant
Le type Variant permet de stocker n'importe quelle valeur de type simple : booléen, numérique (Monétaire, Réel, Entier, ...), chaîne de caractères ou date.
Une variable de ce type peut également contenir des valeurs spéciales comme Empty, Error, Nothing et Null.
Quand une variable de type Variant n'a pas été initialisée, elle contient la valeur Empty, contrairement aux variables de type booléen, numérique, texte ou date, qui sont automatiquement initialisées après leur déclaration.
On utilisera donc ce type de données et la fonction IsEmpty pour tester si une variable a bien été initialisée :
Exemple de code sans initialisation de la variable :fonction IsEmpty
Renvoie une valeur booléenne indiquant si une variable a été initialisée.
Syntaxe
IsEmpty (Expression)
L’argument expression obligatoire est une valeur de type Variant contenant une expression numérique ou une expression de chaîne. Toutefois, la fonction IsEmpty étant utilisée pour déterminer si des variables individuelles sont initialisées, l'argument expression est souvent un nom de variable unique.
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Dim var As Variant If IsEmpty(var) Then ' on teste si la variable contient la valeur Empty MsgBox ("Variable non initialisée !") ' la variable n'a pas été initialisée Else MsgBox ("La variable est égale à " & var) ' la variable a été initialisée, on affiche sa valeur End If
Le code va logiquement afficher "Variable non initialisée !".
Exemple de code avec initialisation de la variable :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Dim var As Variant var = 100 ' on initialise la variable If IsEmpty(var) Then ' on teste si la variable contient la valeur Empty MsgBox ("Variable non initialisée !") ' la variable n'a pas été initialisée Else MsgBox ("La variable est égale à " & var) ' la variable a été initialisée, on affiche sa valeur End If
Le code va logiquement afficher "La variable est égale à 100".
II. Tester l'initialisation d'une variable objet
Une variable objet stocke une référence à un objet en mémoire.
Un objet étant construit à partir d'une classe, pour créer l'objet on utilise l'instruction :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part Set obj = new uneClasse
Pour assigner un objet à une variable, on fait simplement :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part Set obj = monObjet
Quand la variable ne fait référence à aucun objet, elle contient la valeur Nothing.
Par défaut, juste après la déclaration d'une variable objet, celle-ci ne fait référence à aucun objet, et contient par conséquent Nothing.
Pour tester l'initialisation d'une variable objet on utilise donc le mot clé Nothing :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part If obj Is Nothing Then ' on teste si la variable est à Nothing ou si elle fait référence à un objet
Le mot clé Nothing est aussi utilisé pour dissocier une variable d’objet d’un objet réel.
Utilisez l’instruction Set pour affecter Nothing à une variable d’objet :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part Set obj = Nothing ' on affecte Nothing à la variable objet
Considérons maintenant une variable wkb, pour faire référence à un objet Workbook dans Excel.
Exemple de code dans lequel la variable ne fait référence à aucun objet :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Dim wkb As Workbook ' déclaration de la variable objet If wkb Is Nothing Then ' on teste si la variable est à Nothing, ou si elle fait référence à un objet MsgBox ("La variable ne fait référence à aucun objet !") ' la variable ne fait référence à aucun objet, elle est à Nothing Else MsgBox("La variable fait référence à un objet !") ' la variable fait référence à un objet Workbook End If
Le code va logiquement afficher "La variable ne fait référence à aucun objet !".
Exemple de code dans lequel la variable fait référence à un objet Workbook :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Dim wkb As Workbook ' déclaration de la variable objet Set wkb = ThisWorkbook ' affectation d'un objet Workbook à la variable If wkb Is Nothing Then ' on teste si la variable est à Nothing, ou si elle fait référence à un objet MsgBox ("La variable ne fait référence à aucun objet !") ' la variable ne fait référence à aucun objet, elle est à Nothing Else MsgBox ("La variable fait référence à un objet !") ' la variable fait référence à un objet Workbook End If
Le code va logiquement afficher "La variable fait référence à un objet !" .
III. Vérifier la présence d'un élément dans une collection
Ajout d'un élément à la collection :Objet Collection en VBA
Un objet Collection est un ensemble ordonné d’éléments auquel il est possible de faire référence en tant qu’unité.
Remarques
L’objet Collection constitue un moyen simple pour faire référence à un groupe d’éléments liés en tant qu’objet unique.
Il suffit que les éléments, ou membres, d’une collection soient liés par le fait qu’ils existent dans la collection.
Il n’est pas nécessaire que les membres d’une collection partagent le même type de données.
Une collection se crée de la même manière que les autres objets.
Par exemple :
Dim col As New Collection ' déclaration et création de l'objet Collection
Une fois qu’une collection est créée, les membres peuvent être ajoutés à l’aide de la méthode Add et supprimés à l’aide de la méthode Remove.
Des membres spécifiques peuvent être renvoyés à partir de la collection à l’aide de la méthode Item,
tandis que la collection entière peut être itérée à l’aide de la boucle for each... Next , instruction.
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part col.Add "élément", "clé" ' on ajoute à la collection un nouvel élément ayant comme clé "clé"
On y accède en faisant :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part itm = col.Item("clé")
Si on souhaite maintenant accéder à un élément qui n'est pas présent dans la collection :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part itm = col.Item("clé2")
Un message d'erreur va s'afficher :
La solution pour éviter de déclencher l'erreur est de mettre un On Error Resume Next avant la ligne, pour passer à la ligne suivante en cas d'erreur sur la prochaine ligne, puis de désactiver l'instruction On Error Resume Next en mettant un On Error Goto 0 après la ligne :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 On Error Resume Next ' on indique de passer à la ligne suivante en cas d'erreur sur la prochaine ligne itm = col.Item("clé2") ' on tente d'accéder à un élément avec la clé "clé2", si pas d'élément la variable itm ne sera pas initialisée On Error GoTo 0 ' désactive l'instruction On error Resume Next
Si une erreur se produit sur la ligne d'affectation de l'élément, alors la variable itm ne sera pas initialisée.
Si votre code comporte une gestion d'erreurs, il faut remplacer le On Error Goto 0 par On Error Goto Gestion_Erreur pour rétablir la gestion d'erreurs normale.
III-A. Vérifier la présence d'un élément de type Variant
On tente d'affecter à une variable la valeur d'un élément d'une collection en utilisant sa clé.
Si l'élément est présent, la variable contient la valeur de l'élément, dans le cas contraire elle contient la valeur Empty :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Dim col As New Collection ' variable Collection Dim itm As Variant ' variable de type valeur permettant de tester s'il y a un élément identifié par la clé Dim cle As String ' variable contenant la valeur de la clé permettant d'identifier l'élément col.Add "e1", "c1" ' ajout d'un élément à la collection cle = "c1" ' valeur de la clé identifiant l'élément dans la collection On Error Resume Next ' on indique de passer à la ligne suivante en cas d'erreur sur la prochaine ligne itm = col.Item(cle) ' on tente d'accéder à un élément avec la clé "c1", si pas d'élément la variable itm ne sera pas initialisée On Error GoTo 0 ' désactive l'instruction On Error Resume Next If IsEmpty(itm) Then ' si la variable n'a pas été initialisée MsgBox ("Elément non trouvé dans la collection !") ' on indique que l'élément est introuvable Else ' sinon MsgBox ("L'élément a pour valeur " & itm) ' on affiche la valeur de l'élément End If Set col = Nothing ' on libère la variable objet
Le code va logiquement afficher "L'élément a pour valeur e1" .
III-B. Vérifier la présence d'un élément objet
On tente d'assigner à une variable un objet d'une collection en utilisant sa clé.
Si l'élément est présent, la variable contient une référence à cet objet, dans le cas contraire elle contient Nothing :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Dim col As New Collection ' variable Collection Dim itm1 As New Collection ' variable objet : élément de la collection Dim itm As Object ' variable d'objet permettant de tester s'il y a un élément identifié par la clé Dim cle As String ' variable contenant la valeur de la clé permettant d'identifier l'élément col.Add itm1, "c1" ' ajout d'un élément à la collection cle = "c2" ' valeur de la clé identifiant l'élément dans la collection On Error Resume Next ' on indique de passer à la ligne suivante en cas d'erreur sur la prochaine ligne Set itm = col.Item(cle) ' on tente d'accéder à un élément avec la clé "c2", si pas d'élément la variable itm contient Nothing On Error GoTo 0 ' on désactive l'instruction On Error Resume Next If itm Is Nothing Then ' on teste si la variable est à Nothing, ou si elle fait référence à un objet MsgBox ("Elément non trouvé dans la collection !") ' on indique que l'élément est introuvable Else ' sinon MsgBox ("Elément présent dans la collection !") ' on indique que l'élément est présent End If ' on libère les variables objet Set itm1 = Nothing Set col = Nothing
Le code va logiquement afficher "Elément non trouvé dans la collection !" .
IV. Applications
On peut par exemple utiliser cette méthode pour accéder directement à un élément d'une collection d'objets Excel (Feuille de calcul ou autre) ou d'objets Outlook (MailItem ou autre).
Exemple de code pour vérifier la présence d'une feuille dans un classeur Excel :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Dim wkb As Workbook ' déclaration de la variable objet Workbook Dim wks As Worksheet ' déclaration de la variable objet Worksheet Set wkb = ThisWorkbook ' affectation d'un objet Workbook à la variable On Error Resume Next ' on indique de passer à la ligne suivante en cas d'erreur sur la prochaine ligne Set wks = wkb.Sheets("Nom Feuille") ' on tente d'accéder à la feuille nommée "Nom Feuille", si pas de feuille à ce nom, la variable wks contient Nothing On Error GoTo 0 ' désactive l'instruction On Error Resume Next If wks Is Nothing Then ' on teste si la variable est à Nothing, ou si elle fait référence à un objet MsgBox ("La feuille n'est pas présente !") ' la variable ne fait référence à aucun objet, elle est à Nothing Else MsgBox ("La feuille est présente !") ' la variable fait référence à un objet Worksheet End If ' on libère les variables objet Set wks = Nothing Set wkb = Nothing
Si la feuille existe, son accès est donc direct et on peut par exemple la mettre à jour, dans le cas contraire, on peut imaginer de la créer. Il n'est donc pas nécessaire de parcourir la liste des feuilles du classeur.
V. Pour en savoir plus
Si vous souhaitez avoir plus d'informations sur les notions abordées, je vous donne quelques liens à consulter :
Variable de type Variant :
https://docs.microsoft.com/fr-fr/off...iant-data-type
Mot clé Nothing :
https://docs.microsoft.com/fr-fr/off...othing-keyword
Objet Collection :
https://docs.microsoft.com/fr-fr/off...lection-object