VBA prüfen, ob das Objekt gesetzt ist

84

Ich habe eine globale Variable, die eine Instanz meiner benutzerdefinierten Klasse ist.

Wie überprüfe ich, ob das Objekt festgelegt ist oder ob ich es initialisieren muss?

Icode4food
quelle

Antworten:

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

Oder, wenn Sie es andersherum bevorzugen:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If
stakx - nicht mehr beitragen
quelle
2
Ich wusste, dass es einfach sein musste, als ich es googelte und nichts fand! Danke für Ihre Hilfe!
Icode4food
3
Beachten Sie, dass das Prüfen obj Is NothingNICHT mit dem Prüfen identisch ist IsNothing(obj)! Vielen Dank für die korrekte Syntax, um dies zu überprüfen ... nicht sicher, warum IsNothing()sich anders verhält ...
Matt Browne
1
Ich finde es Not (obj Is Nothing)leichter zu verstehen als Not obj Is Nothing. Mein Gehirn weiß nicht, was ein "Not obj" ist!
Martin F
Sie können auch schreiben: Wenn obj IsNot Nothing ist, finde ich es viel klarer als die anderen. Es fühlt sich auch irgendwie genauso an wie C # (ojb! = Null)
Alexandre
3

Der (un) sichere Weg, dies zu tun - wenn Sie damit einverstanden sind, die Option nicht explizit zu verwenden - ist ...

Not TypeName(myObj) = "Empty"

Dies behandelt auch den Fall, wenn das Objekt nicht deklariert wurde. Dies ist nützlich, wenn Sie nur eine Deklaration auskommentieren möchten, um ein bestimmtes Verhalten auszuschalten ...

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

Dies funktioniert, weil VBA eine nicht deklarierte Variable automatisch als leeren Variantentyp instanziiert. Es ist kein zusätzlicher Boolescher Wert erforderlich, um das Verhalten zu verwalten.

Kühles Blau
quelle
3
Niemand sollte jemals einen VBA-Code ohne haben Option Explicit. Es gewinnt nichts außer Probleme. Verwenden Sie die bedingte Kompilierung, um das Verhalten zu "wechseln".
Andre
@andre, ja, fairer Punkt. Ich fühle mich ohne es in Ordnung, weil ich die ungarische Notation für den Umfang verwende, aber ich versuche heutzutage, vba zu vermeiden, wenn ich kann. Das meiste, was ich sehe, handelt von expliziten Erklärungen, Namenssicherheit und der Vermeidung der gefürchteten Varianten. Was sind Ihre Hauptgründe?
Cool Blue
Tatsächlich bekomme ich "Nichts" als Ergebnis des Typnamens und nicht "Leer"
Patrick Lepelletier