VBA检查是否设置了对象

Ico*_*ood 72 ms-access vba

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

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

sta*_*ica 120

If obj Is Nothing Then
    ' need to initialize obj: '
    Set obj = ...
Else
    ' obj already set / initialized. '
End If
Run Code Online (Sandbox Code Playgroud)

或者,如果你喜欢它,反过来说:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If
Run Code Online (Sandbox Code Playgroud)

  • 找到没有什么是正确的答案!;) (20认同)
  • 请注意,检查`obj Is Nothing`与检查`IsNothing(obj)`不同!感谢您使用正确的语法来检查...不确定为什么`IsNothing()`的行为不同...... (3认同)
  • 当我用谷歌搜索它并没有发现任何东西时,我知道它必须很简单!谢谢你的帮助! (2认同)
  • 我发现“Not (obj Is Nothing)”比“Not obj Is Nothing”更容易理解。我的大脑不知道“Not obj”是什么! (2认同)

Coo*_*lue 5

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

Not TypeName(myObj) = "Empty"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为 VBA 会将未声明的变量自动实例化为空变体类型。它消除了辅助布尔值来管理行为的需要。

  • 任何人都不应该拥有没有“Option Explicit”的 VBA 代码。除了问题之外,它一无所获。要“切换”行为,请使用条件编译。 (5认同)

小智 5

使用全局变量时,可能会遇到对象为空的情况。所以,代码:

If Not obj Is Nothing Then
  'obj is already set
Else
  'set obj
End If
Run Code Online (Sandbox Code Playgroud)

产生“需要对象”错误。

在这种情况下,可以进行以下操作:

'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
Run Code Online (Sandbox Code Playgroud)