2011-12-12 13 views
16

C'è un If condizione in un'applicazione VBA come si vede qui sotto:VBA: condizionale - è niente

If Not My_Object Is Nothing Then 
My_Object.Compute 

Quando il codice viene eseguito in modalità di debug, ho scoperto che la condizione If restituisce un vero anche quando My_Object ha "Nessuna variabile".

Qualcuno potrebbe spiegarlo? Voglio che My_Object.Compute sia eseguito solo quando esiste My_Object.

+2

Come si 'My_Object' dichiarata? – GSerg

+2

Puoi chiarire cosa intendi per "nessuna variabile"?Se My_Object è Nothing, sicuramente significa che non punta a un oggetto. Inoltre, qual è la definizione di tipo di My_Object? –

+1

"Voglio che My_Object.Compute sia eseguito solo quando My_Object esiste." Il tuo desiderio è qui concesso. (Significa, c'è qualche scenario in cui questo * non * dovrebbe essere il caso ?!) –

risposta

16

Basato sul tuo commento Issun:

Grazie per la spiegazione. Nel mio caso, l'oggetto viene dichiarato e creato prima della condizione If. Quindi, come utilizzare la condizione Se per verificare l'assenza di variabili <>? In altre parole, non voglio eseguire My_Object.Compute se My_Object ha < Nessun Variabili>

è necessario controllare una delle proprietà dell'oggetto. Senza dirci quale sia l'oggetto, non possiamo aiutarti.

Ho testato diversi oggetti comuni e ho rilevato che un'istanza di Collection senza elementi aggiunti mostra <No Variables> nella finestra di controllo. Se il vostro oggetto è davvero una collezione, è possibile controllare per la condizione <No Variables> utilizzando la proprietà .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 

E 'anche interessante notare che se si dichiara un oggetto As New allora il controllo Is Nothing diventa inutile. Il motivo è che quando si dichiara un oggetto As New viene creato automaticamente quando viene chiamato per la prima volta, anche se la prima volta che lo si chiama è per vedere se esiste!

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

Questa non sembra essere la causa del tuo problema specifico. Ma, dal momento che altri potrebbero trovare questa domanda attraverso una ricerca su Google, ho voluto includerla perché è un errore principiante comune.

+0

Simile, con questa logica, si controllerebbe il ".Value' di una proprietà, rispetto all'oggetto stesso, poiché ovviamente l'oggetto è istanziato, esiste, e quindi" Non è Nothing'. Ho estrapolato quello da questa risposta e ho risolto un problema che stavo vivendo che era simile all'OP cercando di testare un valore di stringa vuoto, che dovevo fare con '<>" "', non il test 'Is Nothing'. Grazie - ottima risposta. – vapcguy

6

Proprio perché l'oggetto di classe non ha variabili non significa che non sia nulla. La dichiarazione e l'oggetto e la creazione di un oggetto sono due cose diverse. Guarda e vedi se stai impostando/creando l'oggetto.

Prendi ad esempio l'oggetto dizionario - solo perché non contiene variabili non significa che non sia stato creato.

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 

Tuttavia se si dichiara un oggetto, ma non crea, non è niente.

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

Grazie per la spiegazione. Nel mio caso, l'oggetto viene dichiarato e creato prima della condizione If. Quindi, come posso usare la condizione If per controllare ? In altre parole, non voglio eseguire My_Object.Compute se My_Object ha StarDotStar

+4

Senza vedere il tuo codice e qual è l'oggetto, temo di non sapere come aiutarti. – aevanko

+0

Un esempio 'dict'! che sorpresa :) - buon esempio dal modo in cui – JMax

0

Nel mio codice di esempio, stavo impostando my object su nulla, e non ho potuto ottenere la parte "non" dell'istruzione if per funzionare con l'oggetto. Ho provato if My_Object is not nothing e anche if not My_Object is nothing. Essa può essere solo una cosa di sintassi che non riesco a capire, ma non ho avuto il tempo per fare un giro, così ho fatto un po 'di soluzione del genere:

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

La tua esperienza mi ha aiutato a informarmi. Stavo cercando di usare 'Se My_Object Is Not Nothing' anche, ma l'altra forma sembra che sia sulla strada giusta. Hai provato 'If Not (My_Object is Nothing) Then 'Do something something?? – mpag