2011-12-12 17 views
16

Hay una condición If en una aplicación de VBA como se ve a continuación:VBA: Condicional - no es nada

If Not My_Object Is Nothing Then 
My_Object.Compute 

Cuando el código se ejecuta en modo de depuración, he encontrado que la condición If devuelve un cierto incluso cuando My_Object tiene "No Variables".

¿Podría alguien explicar esto? Quiero que My_Object.Compute se ejecute solo cuando existe My_Object.

+2

Cómo se declaró 'My_Object'? – GSerg

+2

¿Puedes aclarar a qué te refieres con "sin variables"?Si My_Object es Nothing, definitivamente significa que no está apuntando a un objeto. Además, ¿cuál es la definición de tipo de My_Object? –

+1

"Quiero que My_Object.Compute se ejecute solo cuando existe My_Object". Su deseo se concede por la presente. (Es decir, ¿hay algún escenario donde este * no * sea el caso ?!) –

Respuesta

16

Basado en su comentario a Issun:

Gracias por la explicación. En mi caso, el objeto se declara y crea antes de la condición If. Entonces, ¿cómo uso la condición If para verificar < Sin variables>? En otras palabras, no quiero para ejecutar My_Object.Compute si mi_objeto tiene < ninguna variable>

Es necesario comprobar una de las propiedades del objeto. Sin decirnos cuál es el objeto, no podemos ayudarte.

Probé varios objetos comunes y descubrí que una instancia de Collection sin elementos añadidos muestra <No Variables> en la ventana del reloj. Si el objeto es de hecho una colección, se puede comprobar por la condición <No Variables> utilizando la propiedad .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 

También vale la pena señalar que si se declara un objeto As New entonces el cheque Is Nothing se vuelve inútil. La razón es que cuando declaras un objeto As New, se crea automáticamente cuando se llama por primera vez, ¡incluso si la primera vez que llamas es para ver si existe!

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

Esto no parece ser la causa de su problema específico. Pero, dado que otros pueden encontrar esta pregunta a través de una búsqueda en Google, quería incluirla porque es un error común para principiantes.

+0

Similar, por esta lógica, uno verificaría el '.Value' de una propiedad, que el objeto mismo, ya que por supuesto el objeto está instanciado, existe, y por lo tanto' Is Not Nada'. Extrapolé eso de esta respuesta y resolví un problema que estaba experimentando que era similar a la OP que intenta probar un valor de cadena en blanco, que tuve que hacer con '<>" "', no con la prueba 'No es nada'. Gracias, gran respuesta. – vapcguy

6

Simplemente porque su objeto de clase no tiene variables no significa que no sea nada. Declarar y objeto y crear un objeto son dos cosas diferentes. Mire y vea si está configurando/creando el objeto.

Tomemos por ejemplo el objeto de diccionario: simplemente porque no contiene variables no significa que no se haya creado.

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 

Sin embargo, si declara un objeto pero nunca lo crea, no es nada.

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

Gracias por la explicación. En mi caso, el objeto se declara y crea antes de la condición If. Entonces, ¿cómo uso la condición If para verificar ? En otras palabras, no quiero ejecutar My_Object.Compute si My_Object tiene StarDotStar

+4

Sin ver su código y cuál es el objeto, me temo que no sé cómo ayudarlo en eso. – aevanko

+0

¡Un ejemplo de 'dict'! qué sorpresa :) - buen ejemplo por cierto – JMax

0

En mi código de ejemplo, estaba configurando my object en nada, y no pude obtener la parte "no" de la instrucción if para trabajar con el objeto. Intenté if My_Object is not nothing y también if not My_Object is nothing. Puede ser sólo una cosa sintaxis no puedo averiguar pero no tenía tiempo para perder el tiempo, así que lo hice un poco de solución como esta:

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

Tu experiencia me ayudó a informarme. He estado tratando de usar 'If My_Object Is Not Nothing' también, pero su otra forma parece que está en el camino correcto. ¿Intentó 'If Not (My_Object is Nothing) Then 'Do something'? – mpag