VBA verificar se o objeto está definido

92

Eu tenho uma variável global que é uma instância da minha classe personalizada.

Como verifico se o objeto está definido ou se preciso inicializá-lo?

Icode4food
fonte

Respostas:

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

Ou, se você preferir o contrário:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If
stakx - não contribui mais
fonte
2
Eu sabia que tinha que ser simples quando pesquisei no Google e não encontrei nada! Obrigado pela ajuda!
Icode4food
3
Observe que verificar obj Is NothingNÃO é o mesmo que verificar IsNothing(obj)! Obrigado pela sintaxe correta para verificar isso ... não tenho certeza por que IsNothing()se comporta de maneira diferente ...
Matt Browne
1
Acho Not (obj Is Nothing)mais fácil de entender do que Not obj Is Nothing. Meu cérebro não sabe o que é um "Não obj"!
Martin F
Você também pode escrever: If obj IsNot Nothing, que considero muito mais claro do que o resto. Também parece o mesmo que C # (ojb! = Null)
Alexandre
4

A maneira (des) segura de fazer isso - se você concordar em não usar a opção explícita - é ...

Not TypeName(myObj) = "Empty"

Isso também trata do caso se o objeto não foi declarado. Isso é útil se você quiser apenas comentar uma declaração para desligar algum comportamento ...

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

Isso funciona porque o VBA irá instanciar automaticamente uma variável não declarada como um tipo de Variante Vazia. Ele elimina a necessidade de um Booleano auxiliar para gerenciar o comportamento.

Cool Blue
fonte
4
Ninguém deveria ter qualquer código VBA sem Option Explicit. Não ganha nada, exceto problemas. Para "mudar" o comportamento, use a Compilação Condicional.
André
@andre, sim, ponto justo. Eu me sinto bem sem ele porque eu uso a notação húngara para o escopo, mas tento evitar vba hoje em dia, se puder. A maior parte do que vejo é sobre declarações explícitas, segurança de nomes e evitar as variantes temidas. Quais são seus principais motivos?
Cool Blue
Na verdade, recebo "Nothing" como resultado de typename, e não "Empty"
Patrick Lepelletier