2011-12-12 15 views
16

Jest warunek w aplikacji VBA If jak widać poniżej:VBA: Warunkowe - Czy nic

If Not My_Object Is Nothing Then 
My_Object.Compute 

Gdy kod jest uruchamiany w trybie debugowania, okazało się, że stan If powraca prawdziwa nawet gdy My_Object ma "Brak zmiennych".

Czy ktoś mógłby to wyjaśnić? Chcę, aby My_Object.Compute było wykonywane tylko wtedy, gdy istnieje My_Object.

+2

W jaki sposób zadeklarowano "Moje_Obiekt"? – GSerg

+2

Czy możesz wyjaśnić, co masz na myśli przez "brak zmiennych"?Jeśli My_Object jest Nothing, to zdecydowanie oznacza, że ​​nie wskazuje obiektu. Plus, jaka jest definicja typu My_Object? –

+1

"Chcę, aby My_Object.Compute był uruchamiany tylko wtedy, gdy istnieje Mój obiekt." Twoje życzenie zostaje niniejszym przyznane. (Czy jest jakiś scenariusz, w którym to * nie * miałoby się tak dziać ?!) –

Odpowiedz

16

Bazując na swoim komentarzu do Issun:

Dzięki za wyjaśnienie. W moim przypadku obiekt jest zadeklarowany i utworzony przed warunkiem If. Więc, jak używać warunku If, aby sprawdzić < Brak zmiennych>? Innymi słowy, nie chcę, aby wykonać My_Object.Compute jeśli My_Object ma < Brak Zmienne>

Trzeba sprawdzić jedną z właściwości obiektu. Nie mówiąc nam, czym jest obiekt, nie możemy ci pomóc.

Zrobiłem test kilku popularnych obiektów i odkryłem, że utworzony egzemplarz Collection bez dodanych elementów pokazuje <No Variables> w oknie zegarka. Jeśli obiekt jest w istocie zbiorem, można sprawdzić stan <No Variables> pomocą właściwości .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 

Warto również zauważyć, że jeśli zadeklarować dowolny obiekt As New następnie sprawdzenie Is Nothing staje się bezużyteczny. Powodem jest to, że gdy zadeklarujesz obiekt As New, zostanie on utworzony automatycznie po pierwszym wywołaniu, nawet jeśli za pierwszym razem go sprawdzisz, czy istnieje!

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

To nie wydaje się być przyczyną twojego konkretnego problemu. Ale ponieważ inni mogą znaleźć to pytanie w wyszukiwarce Google, chciałem uwzględnić to pytanie, ponieważ jest to typowy błąd dla początkujących.

+0

Podobną logiką byłoby sprawdzenie ".Value" właściwości, niż samego obiektu, ponieważ oczywiście obiekt jest instancjonowany, istnieje, a zatem 'nie jest Nic ". Ekstrapolowałem to na podstawie tej odpowiedzi i rozwiązałem problem, którego doświadczałem, który był podobny do OP, próbujących przetestować pustą wartość ciągu, co musiałem zrobić z '<>" ", a nie z testem" Czy nic ". Dzięki - świetna odpowiedź. – vapcguy

6

Tylko dlatego, że obiekt klasy nie zawiera żadnych zmiennych, nie oznacza, że ​​jest on niczym. Deklarowanie i obiekt oraz tworzenie obiektu to dwie różne rzeczy. Sprawdź i zobacz, czy ustawiasz/tworzysz obiekt.

Weźmy na przykład obiekt słownika - tylko dlatego, że nie zawiera żadnych zmiennych, nie oznacza, że ​​nie został utworzony.

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 

Jednak jeśli zadeklarować obiekt, ale nigdy go utworzyć, to nic.

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 
+0

Dzięki za wyjaśnienie. W moim przypadku obiekt jest zadeklarowany i utworzony przed warunkiem If. Więc, jak używać warunku If, aby sprawdzić ? Innymi słowy, nie chcę wykonywać My_Object.Compute, jeśli My_Object ma StarDotStar

+4

Bez zobaczenia kodu i obiektu, obawiam się, że nie wiem, jak ci w tym pomóc. – aevanko

+0

Przykład "dict"! co za niespodzianka :) - dobry przykład przy okazji – JMax

0

W moim przykładowym kodzie ustawiłem my object na nic i nie mogłem uzyskać "nie" części instrukcji if do pracy z obiektem. Próbowałem if My_Object is not nothing, a także if not My_Object is nothing. Może to być po prostu kwestia składni, której nie mogę rozgryźć, ale nie miałem czasu, żeby się rozejrzeć, więc zrobiłem małe obejście tego:

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

Twoje doświadczenie pomogło mi w uzyskaniu informacji. Próbowałem również użyć 'If My_Object Is Not Nothing', ale twoja druga forma wygląda tak, jakby była na właściwej ścieżce. Czy wypróbowałeś 'If Not (My_Object is Nothing) Then 'Do something'? – mpag