VBA verifica si el objeto está configurado


89

Tengo una variable global que es una instancia de mi clase personalizada.

¿Cómo verifico si el objeto está configurado o si necesito inicializarlo?

Respuestas:


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

O, si lo prefiere al revés:

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

2
¡Sabía que tenía que ser simple cuando lo busqué en Google y no encontré nada! ¡Gracias por tu ayuda!
Icode4food

3
Tenga en cuenta que comprobar obj Is NothingNO es lo mismo que comprobar IsNothing(obj). Gracias por la sintaxis correcta para verificar esto ... no estoy seguro de por qué se IsNothing()comporta de manera diferente ...
Matt Browne

1
Encuentro Not (obj Is Nothing)más fácil de entender que Not obj Is Nothing. ¡Mi cerebro no sabe qué es un "No obj"!
Martin F

También puede escribir: If obj IsNot Nothing, que lo encuentro mucho más claro que el resto. También se siente un poco lo mismo que C # (ojb! = Null)
Alexandre

4

La forma (no) segura de hacer esto, si está de acuerdo con no usar la opción explícita, es ...

Not TypeName(myObj) = "Empty"

Esto también maneja el caso si el objeto no ha sido declarado. Esto es útil si solo desea comentar una declaración para desactivar algún comportamiento ...

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

Esto funciona porque VBA creará automáticamente una instancia de una variable no declarada como un tipo de variante vacía. Elimina la necesidad de un booleano auxiliar para gestionar el comportamiento.


4
Nadie debería tener ningún código VBA sin Option Explicit. No gana nada excepto problemas. Para "cambiar" el comportamiento, utilice la compilación condicional.
Andre

@andre, sí, punto justo. Me siento bien sin él porque uso la notación húngara para el alcance, pero trato de evitar vba estos días si puedo. La mayor parte de lo que veo es sobre declaraciones explícitas, seguridad de nombres y evitar las temidas variantes. ¿Cuáles son sus principales razones?
Cool Blue

De hecho, obtengo "Nada" como resultado de typename, y no "Vacío"
Patrick Lepelletier
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.