Question: Comment vérifier si un Objet de type Variant est vide en VBA?
Comme une variable de type Variant
peut contenir toute sorte d'information, il est parfois difficile de vérifier si cette variable est vide ou pas. Souvent, on obtient un message d'erreur: "Object type mismatch" car le test de la valeur du Variant
est d'un type différent que son contenu.
Attention: Et si vous pensez que ce problème ne vous concerne pas car vous n'utilisez pas les Variant
, détrompez vous! En VBA, toute variable dont le type n'est pas défini explicitement (avec Dim
) est considérée par défaut comme un Variant
!
Exemple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Exemple_TestVariantEstVide() Dim MaVariable As Variant MaVariable = Split("a;b;c", ";") 'ceci va créer un 'Array' 'voici le test habituel pour vérifier si une variable est vide: If MaVariable <> "" Then 'mon code Else 'mon code End If 'ce test va créer une erreur de "type mismatch"! End Sub |
Résultat du test:
Pour contourner ce problème, il y a une solution toute faite: la fonction VBA IsEmpty.
Cette fonction VBA de base retournera la valeur True
ou False
indépendamment du type de contenu de la variable de type Variant
(que ce soit un nombre, une chaîne de caractères ou un Array
…).
Exemple d'utilisation d'une variable Variant et du test si elle est vide
Le code VBA qui suit montre une situation où on a besoin de voir si oui ou non, le Classeur contient des liens vers d'autres classeurs. Ce type de contenu est idéal pour l'utilisation d'une variable du type Variant
. On "remplit" donc cette variable avec des liens vers d'autres classeurs et ensuite, on vérifie s'il y en a ou pas (dans ce cas, la variable de type Variant sera vide) et d'après le résultat, on exécute des opérations nécessaires.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'... Dim MaVariable As Variant 'exemple: vérifier si le Classeur contient des liens vers 'd'autres Classeurs MaVariable = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks) If IsEmpty(MaVariable) = True Then 'mon code Else 'mon code End If |
Fonction VBA prête à l'emploi: EstVariantVide
Si vous préférez avoir une fonction dédiée à ce test (et en français), je vous propose une fonction VBA qui renvoie "Vrai" ou "Faux" (True
ou False
) selon que la variable testée est vide ou pas.
1 2 3 4 5 6 7 |
Public Function EstVariantVide(ByVal var As Variant) If IsEmpty(var) = True Then EstVariantVide = True Else EstVariantVide = False End If End Sub |
Ce "problème" démontre bien que le type de variable Variant
devrait être utilisé avec précaution. Il est certes facile de succomber à la tentation de l'employer pour pouvoir y loger "n'importe quoi" mais une fois qu'il est dans le code, sa gestion peut vite devenir relativement fastidieuse…
Je vous conseille donc de l'utiliser seulement là, où c'est inévitable. En définissant vos variables de manière précise, votre code VBA devient plus résistant aux erreurs, plus rapide et également plus lisible (pour vous comme pour ceux qui liront votre code VBA)…
Si vous souhaitez en apprendre plus sur le type Variant
, vous pouvez consulter la page dédiée à ce sujet sur le site internet de Microsoft.
Pour aller plus loin en VBA…
Et voici quelques autres articles qui pourraient vous servir:
- Gestion des dates et heures en VBA
- Manipulation des fichiers en VBA
- Comment utiliser la fonction RECHERCHEV en VBA?
- Référentiel Malin VBA: toutes les fonctions/instructions/événements & opérateurs (e-book)
- Débloquer VBA dans les fichiers Excel en provenance d'internet
5 commentaires sur “VBA: vérifier si Variant est vide (Empty)”
Comment faire simple quand on peu faire compliqué !!!
beaucoup plus simple pour ta fonction
Public Function EstVariantVide(ByVal var As Variant) As Boolean
EstVariantVide = IsEmpty(var)
End Function
d'autre part ; tout test
if X = true then …
est beaucoup plus simplement écrit :
if X then …
car "if" demande un booléen, donc si X est un booléen, pas besoin de comparaison, soit on a besoin du résultat quand vrai, et à ce moment là la variable se suffi a elle même, ou si on a besoin du résultat quand faux, et à ce moment là ce n'est pas d'un test = false ; mais de précéder d'un NOT : "if Not X Then …".
Les bases de la logique combinatoire quoi !!!
Néanmoins, l'information principale est là : "IsEmpty" ; c'est tout ce que je cherchais ; pour cela merci.
Bonjour,
oui, en effet, on peut toujours faire plus simple, plus concis…
MAIS…
Ce site se veut également "éducatif". Nombreux visiteurs ne connaissent pas grande chose à VBA ou ne font que débuter.
Pour eux, il me semble, il est plus intéressant de présenter les codes bien structurés, lisibles et donc facilement compréhensibles.
Pour les utilisateurs avertis comme toi, faire un copier/coller de 4 lignes plutôt que de 2 ne change pas grande chose je pense.
Et, bien sûr, pour ceux qui préfèrent le code "à leur façon", le code présenté ici peut être modifié à volonté… Mes codes servent alors plutôt de "guide" ou de "point de départ".
Ce qui compte, c'est justement que mon code a pu te mettre sur le chemin de la fonction
IsEmpty
. À toi de voir ensuite comment tu l'utilises 😉Bàt, Martin
Merci pour la mine d'information que propose votre site
J'ai rencontrer ce problème, avec un Array en Variant,
Debug.Print renvoyais "Null" sur une des valeurs.
="", Is Nothing, Is Null , = Null, ="Null", = VbNull …, rien de fonctionnais pour ma condition.
Ma solution a été de traiter la valeur avec VarType() comme ceci :
If VarType(MyArray(colonne, ligne)) = 1 then
Et voila je n'ai plus jamais eu de problème de ce type, pouvant connaitre le vartype d'une variable et le tester.
Bien vu Deskal. Merci pour le partage!