VBA sprawdza, czy obiekt jest ustawiony


89

Mam zmienną globalną, która jest instancją mojej klasy niestandardowej.

Jak sprawdzić, czy obiekt jest ustawiony lub czy muszę go zainicjować?

Odpowiedzi:


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

Lub, jeśli wolisz odwrotnie:

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

2
Wiedziałem, że to musi być proste, kiedy wyszukałem go w Google i nic nie znalazłem! Dzięki za pomoc!
Icode4food

3
Zauważ, że sprawdzanie obj Is Nothingto NIE to samo, co sprawdzanie IsNothing(obj)! Dzięki za poprawną składnię, aby to sprawdzić ... nie wiem, dlaczego IsNothing()zachowuje się inaczej ...
Matt Browne

1
Uważam, Not (obj Is Nothing)łatwiejsze do zrozumienia niż Not obj Is Nothing. Mój mózg nie wie, co to jest „nie przedmiot”!
Martin F

Możesz również napisać: If obj IsNot Nothing, co uważam za znacznie jaśniejsze niż reszta. To również trochę tak samo jak C # (ojb! = Null)
Alexandre

4

(Nie) bezpieczny sposób na zrobienie tego - jeśli nie masz nic przeciwko nieużywaniu opcji jawnej - to ...

Not TypeName(myObj) = "Empty"

Obsługuje to również przypadek, jeśli obiekt nie został zadeklarowany. Jest to przydatne, jeśli chcesz po prostu zakomentować deklarację, aby wyłączyć pewne zachowanie ...

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

Działa to, ponieważ VBA automatycznie utworzy wystąpienie niezadeklarowanej zmiennej jako typu Empty Variant. Eliminuje potrzebę stosowania pomocniczego boole'a do zarządzania zachowaniem.


4
Nikt nie powinien mieć żadnego kodu VBA bez Option Explicit. Nic nie zyskuje poza problemami. Aby „zmienić” zachowanie, użyj kompilacji warunkowej.
Andre

@andre, tak, słuszna uwaga. Czuję się dobrze bez tego, ponieważ używam notacji węgierskiej dla zakresu, ale obecnie staram się unikać VBA, jeśli mogę. Większość z tego, co widzę, dotyczy wyraźnych deklaracji, bezpieczeństwa nazw i unikania przerażających wariantów. Jakie są Twoje główne powody?
Cool Blue

W rzeczywistości otrzymuję „Nothing” jako wynik nazwy typu, a nie „Empty”
Patrick Lepelletier
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.