web-dev-qa-db-fra.com

VBA: conditionnel - n'est rien

Il existe une condition If dans une application VBA, comme indiqué ci-dessous:

If Not My_Object Is Nothing Then
My_Object.Compute

Lorsque le code est exécuté en mode débogage, j'ai constaté que la condition If renvoie une valeur true même lorsque My_Object contient "Aucune variable".

Quelqu'un pourrait-il s'il vous plaît expliquer cela? Je veux que My_Object.Compute ne soit exécuté que lorsque My_Object existe.

21
StarDotStar

Sur la base de votre commentaire à Issun:

Merci pour l'explication. Dans mon cas, l'objet est déclaré et créé avant la condition If. Alors, comment utiliser If condition pour rechercher <Aucune variable>? En d'autres termes, je ne veux pas exécuter My_Object.Compute si My_Object a <Aucune variable>

Vous devez vérifier l'une des propriétés de l'objet. Sans nous dire ce qu'est l'objet, nous ne pouvons pas vous aider.

J'ai testé plusieurs objets courants et constaté qu'une Collection instanciée sans ajout d'éléments affiche <No Variables> dans la fenêtre de surveillance. Si votre objet est bien une collection, vous pouvez rechercher la condition <No Variables> à l'aide de la propriété .Count:

Sub TestObj()
Dim Obj As Object
    Set Obj = New Collection
    If Obj Is Nothing Then
        Debug.Print "Object not instantiated"
    Else
        If Obj.Count = 0 Then
            Debug.Print "<No Variables> (ie, no items added to the collection)"
        Else
            Debug.Print "Object instantiated and at least one item added"
        End If
    End If
End Sub

Il est également intéressant de noter que si vous déclarez un objet As New, la vérification Is Nothing devient inutile. La raison en est que lorsque vous déclarez un objet As New, il est créé automatiquement lors de son premier appel, même si vous l'appelez pour la première fois, c'est pour voir s'il existe!

Dim MyObject As New Collection
If MyObject Is Nothing Then  ' <--- This check always returns False

Cela ne semble pas être la cause de votre problème spécifique. Mais, étant donné que d’autres peuvent trouver cette question grâce à une recherche Google, je voulais l’inclure car c’est une erreur courante pour les débutants.

22
mwolfe02

Parce que votre objet de classe n'a pas de variables ne signifie pas que ce n'est rien. Déclarer et créer et créer un objet sont deux choses différentes. Regardez et voyez si vous définissez/créez l'objet.

Prenons par exemple l'objet dictionnaire - le fait qu'il ne contienne aucune variable ne signifie pas qu'il n'a pas été créé.

Sub test()

Dim dict As Object
Set dict = CreateObject("scripting.dictionary")

If Not dict Is Nothing Then
    MsgBox "Dict is something!"  '<--- This shows
Else
    MsgBox "Dict is nothing!"
End If

End Sub

Cependant, si vous déclarez un objet mais ne le créez jamais, ce n'est rien.

Sub test()

Dim temp As Object

If Not temp Is Nothing Then
    MsgBox "Temp is something!"
Else
    MsgBox "Temp is nothing!" '<---- This shows
End If

End Sub
8
aevanko

Dans mon exemple de code, je définissais my object sur rien et je ne pouvais pas faire en sorte que la partie "non" de l'instruction if ne fonctionne pas avec l'objet. J'ai essayé if My_Object is not nothing et aussi if not My_Object is nothing. C'est peut-être juste un problème de syntaxe que je n'arrive pas à comprendre mais je n'avais pas le temps de perdre mon temps, alors j'ai fait une petite solution comme celle-ci:

if My_Object is Nothing Then
    'do nothing
Else
    'Do something
End if
0
WannabeProger