VBA检查是否设置了对象


89

我有一个全局变量,它是我的自定义类的实例。

如何检查对象是否已设置或是否需要初始化?

Answers:


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

或者,如果您更喜欢,则:

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

2
我知道当我用Google搜索它时,它必须很简单,却一无所获!谢谢你的帮助!
Icode4food

3
请注意,检查obj Is Nothing与检查不一样IsNothing(obj)!感谢您使用正确的语法进行检查...不确定为什么IsNothing()行为会有所不同...
马特·布朗

1
我发现Not (obj Is Nothing)比容易理解Not obj Is Nothing。我的大脑不知道“ Not obj”是什么!
Martin F

您还可以编写:如果obj Is Not Nothing,我发现它比其余的要清晰得多。感觉也和C#一样(ojb!= null)
亚历山大

4

执行此操作的(不安全)方式-如果您可以不使用显式选项,则可以-是...

Not TypeName(myObj) = "Empty"

如果未声明该对象,这也可以处理这种情况。如果您只想注释掉声明以关闭某些行为,这将非常有用...

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

之所以可行,是因为VBA会将未声明的变量自动实例化为Empty Variant类型。它消除了使用辅助布尔来管理行为的需求。


4
没有谁都不会有任何VBA代码Option Explicit。除了问题,它什么也没有。若要“切换”行为,请使用条件编译。
安德烈

@andre,是的,很公平。如果没有它,我会感觉很好,因为我使用匈牙利符号表示范围,但是如果可以的话,我会尽量避免使用vba。我所看到的大部分内容都是关于显式声明,名称安全以及避免可怕的变体。您的主要原因是什么?
Cool Blue

事实上,我得到“无”为类型名的结果,而不是“空”
帕特里克Lepelletier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.