VBA check if object is set
Asked Answered
D

3

105

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?

Distressful answered 13/4, 2010 at 17:20 Comment(0)
F
163
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
Floriaflorian answered 13/4, 2010 at 17:22 Comment(5)
I knew it had to be simple when I Googled it and found nothing! Thanks for your help!Distressful
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...Darwinism
I find Not (obj Is Nothing) easier to understand than Not obj Is Nothing. My brain doesn't know what a "Not obj" is!Koo
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)Hadsall
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...Hie
S
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.

Sundsvall answered 30/10, 2016 at 3:10 Comment(3)
Nobody should ever have any VBA code without Option Explicit. It gains nothing except problems. To "switch" behavior, use Conditional Compiling.Tanjatanjore
@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?Sundsvall
In fact i get "Nothing" as result of typename , and not "Empty"Dandridge
G
5

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
End If
Giraldo answered 11/8, 2021 at 12:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.