What are the benefits of setting objects to “Nothing”

If this was managed .NET code (which is garbage-collected), you’d have to Release every single COM object you ever accessed, lest the host process (EXCEL.EXE) would likely remain running in the background, consuming memory and unable to completely tear down.

But this is VBA code (which is reference-counted), moreover VBA code that uses objects that the host application controls – these objects will die when the host application shuts down, and when that happens the VBA execution context is long gone.

In other words, all these Set ... = Nothing instructions are completely redundant.


In some specific cases, when you’re dealing with a 3rd-party API / type library, it’s possible that objects don’t entirely clean up. For example you might be creating an Access.Application instance, and find that a “ghost” ACCESS.EXE process remains open in Task Manager well after Excel exited: that’s a sign that you’re leaking an object reference somehow, somewhere, and Set ... = Nothing can help prevent that.

However I wouldn’t recommend systematically nulling all object references like that. Only when not doing it causes a problem. And even then, it’s going to be one or two objects dragging everything down, not all of them. If ACCESS.EXE shuts down properly, there’s no reason to clutter up your code with such instructions.

Avoiding storing object references in global state helps, too. If everything is local, in theory all objects involved are destroyed as soon as the local scope exits.

Leave a Comment