107

I have a global variable that is an instance of my custom class.

How do I check if the object is set or if I need to initialize it?

3 Answers 3

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

Or, if you prefer it the other way around:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If
Sign up to request clarification or add additional context in comments.

5 Comments

I knew it had to be simple when I Googled it and found nothing! Thanks for your help!
Note that checking obj Is Nothing is NOT the same as checking IsNothing(obj)! Thanks for the correct syntax to check this...not sure why IsNothing() behaves differently...
I find Not (obj Is Nothing) easier to understand than Not obj Is Nothing. My brain doesn't know what a "Not obj" is!
You can also write : If obj IsNot Nothing which I find it much more clearer than the rest. It also kinda feel the same as C# (ojb != null)
Thanks for the short and clear answer! IMO, the straight read "if obj is nothing then create the obj else exit" is the best human readable syntax. The double negation is weird, even in real human relations...
7

When using global variables it's possible to run into a situation in which the object is empty. So, the code:

If Not obj Is Nothing Then
  'obj is already set
Else
  'set obj
End If

produces an 'object required' error.

In this situation, the following works:

'First check it is initialized 
If IsObject(obj) Then
     'Then check if it is set
     If Not obj Is Nothing Then
        'obj is set
     Else
        'set obj
     End If
Else
    'set obj
End If

2 Comments

Does the IsObject test need an Else clause? If the object isn't initialized, it needs to be set, I imagine.
@Smandoli that makes sense. I updated the answer. Thank you.
5

The (un)safe way to do this - if you are ok with not using option explicit - is...

Not TypeName(myObj) = "Empty"

This also handles the case if the object has not been declared. This is useful if you want to just comment out a declaration to switch off some behaviour...

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

This works because VBA will auto-instantiate an undeclared variable as an Empty Variant type. It eliminates the need for an auxiliary Boolean to manage the behaviour.

3 Comments

Nobody should ever have any VBA code without Option Explicit. It gains nothing except problems. To "switch" behavior, use Conditional Compiling.
@andre, yes, fair point. I feel ok without it because I use hungarian notation for scope, but I try to avoid vba these days if I can. Most of what I see is about explicit declarations, name safety and avoiding the dreaded variants. What are your key reasons?
In fact i get "Nothing" as result of typename , and not "Empty"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.