Vérification VBA si l'objet est défini


89

J'ai une variable globale qui est une instance de ma classe personnalisée.

Comment vérifier si l'objet est défini ou si je dois l'initialiser?

Réponses:


135
If obj Is Nothing Then
    ' need to initialize obj: '
    Set obj = ...
Else
    ' obj already set / initialized. '
End If

Ou, si vous préférez l'inverse:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If

2
Je savais que ça devait être simple quand je l'ai cherché sur Google et que je n'ai rien trouvé! Merci de votre aide!
Icode4food

3
Notez que la vérification obj Is Nothingn'est PAS la même chose que la vérification IsNothing(obj)! Merci pour la syntaxe correcte pour vérifier cela ... IsNothing()
Matt Browne

1
Je trouve Not (obj Is Nothing)plus facile à comprendre que Not obj Is Nothing. Mon cerveau ne sait pas ce qu'est un "Not obj"!
Martin F

Vous pouvez aussi écrire: If obj IsNot Nothing que je trouve beaucoup plus clair que le reste. C'est aussi un peu la même chose que C # (ojb! = Null)
Alexandre

4

Le moyen (non) sûr de le faire - si vous êtes d'accord pour ne pas utiliser l'option explicit - est ...

Not TypeName(myObj) = "Empty"

Cela gère également le cas si l'objet n'a pas été déclaré. Ceci est utile si vous souhaitez simplement commenter une déclaration pour désactiver certains comportements ...

Dim myObj as Object
Not TypeName(myObj) = "Empty"  '/ true, the object exists - TypeName is Object

'Dim myObj as Object
Not TypeName(myObj) = "Empty"  '/ false, the object has not been declared

Cela fonctionne car VBA instanciera automatiquement une variable non déclarée en tant que type Variant vide. Il élimine le besoin d'un booléen auxiliaire pour gérer le comportement.


4
Personne ne devrait jamais avoir de code VBA sans Option Explicit. Il ne gagne rien sauf des problèmes. Pour «changer» de comportement, utilisez la compilation conditionnelle.
Andre

@andre, oui, bon point. Je me sens bien sans cela car j'utilise la notation hongroise pour la portée, mais j'essaie d'éviter vba ces jours-ci si je le peux. La plupart de ce que je vois concerne les déclarations explicites, la sécurité des noms et le fait d'éviter les variantes redoutées. Quelles sont vos principales raisons?
Cool Blue

En fait je reçois "Nothing" comme résultat de typename, et non "Empty"
Patrick Lepelletier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.