VBA:条件语句 - 是否为Nothing

26

下面是VBA应用程序中的一个If条件:

If Not My_Object Is Nothing Then
My_Object.Compute

当以调试模式运行代码时,我发现即使My_Object没有任何变量,“If”条件语句也会返回 true。

请问有人能够解释一下这是为什么吗?我希望只有在My_Object存在的情况下才执行My_Object.Compute


2
你能澄清一下“没有变量”是什么意思吗?如果My_Object是空的,那肯定意味着它没有指向任何对象。此外,My_Object的类型定义是什么? - Joel Goodwin
1
“我希望只有在My_Object存在时才执行My_Object.Compute。”你的愿望已经实现。(也就是说,是否存在任何情况使得这种情况不成立?!) - Jean-François Corbett
GSerg,Joel Goodwin,My_Object是外部库中一个类的对象。在调试模式下,当即将执行If条件时,向My_Object添加观察点会显示<无变量>。 - StarDotStar
这是我们中任何人都听说过的外部库吗? - Joel Goodwin
你在这里使用了"On Error Resume Next"吗? - JimmyPena
3个回答

29

根据您对Issun的评论:

感谢您的解释。在我的情况下,对象是在 If 条件之前声明和创建的。那么,我该如何使用 If 条件来检查 < No Variables>?换句话说,如果 My_Object 具有 < No Variables>,则不执行 My_Object.Compute。

您需要检查对象的一个属性。如果没有告诉我们对象是什么,我们无法帮助您。

我测试了几个常见的对象,并发现一个已实例化但未添加任何项的 Collection 在监视窗口中显示 <No Variables>。 如果您的对象确实是集合,则可以使用 .Count 属性检查 <No Variables> 条件:

Sub TestObj()
Dim Obj As Object
    Set Obj = New Collection
    If Obj Is Nothing Then
        Debug.Print "Object not instantiated"
    Else
        If Obj.Count = 0 Then
            Debug.Print "<No Variables> (ie, no items added to the collection)"
        Else
            Debug.Print "Object instantiated and at least one item added"
        End If
    End If
End Sub
值得注意的是,如果您声明任何对象为 As New ,那么 Is Nothing 检查就变得无用了。原因是当您将一个对象声明为 As New 时,它在第一次调用时会自动创建,即使您第一次调用它是为了检查它是否存在!
Dim MyObject As New Collection
If MyObject Is Nothing Then  ' <--- This check always returns False

这似乎不是你特定问题的原因。但是,由于其他人可能通过Google搜索找到这个问题,我想包括它,因为这是常见的初学者错误。


同样地,按照这个逻辑,人们会检查属性的.Value而不是对象本身,因为当然对象已经被实例化、存在,因此Is Not Nothing。我从这个答案中推断出来,并解决了一个类似于OP尝试测试空字符串值的问题,我必须使用<> ""而不是Is Nothing测试。谢谢 - 很好的答案。 - vapcguy

12

仅仅因为你的类对象没有变量并不意味着它是空的。声明一个对象和创建一个对象是两回事。查看并确定你是否正在设置/创建该对象。

举个例子,字典对象 - 仅仅因为它不包含变量并不意味着它未被创建。

Sub test()

Dim dict As Object
Set dict = CreateObject("scripting.dictionary")

If Not dict Is Nothing Then
    MsgBox "Dict is something!"  '<--- This shows
Else
    MsgBox "Dict is nothing!"
End If

End Sub

但是,如果你声明了一个对象但从未创建它,那么它就是不存在的。

Sub test()

Dim temp As Object

If Not temp Is Nothing Then
    MsgBox "Temp is something!"
Else
    MsgBox "Temp is nothing!" '<---- This shows
End If

End Sub

谢谢您的解释。在我的情况下,对象在 If 条件之前被声明和创建。那么,我该如何使用 If 条件来检查 <无变量>?换句话说,如果 My_Object 没有 <变量>,我不想执行 My_Object.Compute。 - StarDotStar
4
很抱歉,如果我不能看到您的代码和对象是什么,我就无法帮助您解决这个问题。 - Gaijinhunter
一个 dict 的例子!真是个惊喜 :) - 顺便说一句,这是个好例子。 - JMax

-1
在我的示例代码中,我将我的对象设置为nothing,但是无法使用该对象使if语句中的“不是”部分工作。 我尝试了if My_Object is not nothingif not My_Object is nothing。这可能只是一个我无法解决的语法问题,但我没有时间进行调试,所以我做了一些小的变通,像这样:
if My_Object is Nothing Then
    'do nothing
Else
    'Do something
End if

2
你的经验对我很有帮助。我之前一直在尝试使用 If My_Object Is Not Nothing,但是你提供的另一种形式看起来更加正确。你试过 If Not (My_Object is Nothing) Then ' Do something 吗? - mpag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接