2011-12-12 65 views
16

有一個If條件的VBA應用程序,如下圖所示:VBA:條件 - 是沒有

If Not My_Object Is Nothing Then 
My_Object.Compute 

當代碼在調試模式下運行,我發現If條件返回真,即使My_Object有「無變數」。

有人能解釋一下嗎?我想My_Object.Compute只有在My_Object存在時才能執行。

+2

如何聲明My_Object? – GSerg

+2

你能澄清你的意思嗎?「沒有變數」?如果My_Object是Nothing,它肯定意味着它沒有指向一個對象。另外,My_Object的類型定義是什麼? –

+1

「我希望My_Object.Compute僅在存在My_Object時執行。」特此授予您的意願。 (意思是說,有沒有這種情況會導致這種情況呢?) –

回答

16

基於對Issun您的評論:

感謝您的解釋。在我的情況下,該對象是在If條件之前聲明和創建的。那麼,如何使用If條件檢查<無變量>?換句話說,如果My_Object具有<沒有變量,我不想執行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搜索找到此問題,因此我想將其包含在內,因爲這是一個常見的初學者錯誤。

+0

類似的,通過這個邏輯,我們可以檢查一個屬性的'.Value',而不是對象本身,因爲當然這個對象是實例化的,存在的,因此'不是Nothing'。我從這個答案中推斷出這個問題,並解決了我遇到的問題,這與OP試圖測試一個空字符串值相似,我不得不用''>「」'而不是'Is Nothing'測試。謝謝 - 很好的答案。 – vapcguy

6

只是因爲你的類對象沒有變量並不意味着它不是什麼。聲明和對象並創建一個對象是兩件不同的事情。看看你是否設置/創建對象。

拿字典對象爲例 - 僅僅因爲它不包含變量並不意味着它沒有被創建。

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 
+0

感謝您的解釋。在我的情況下,該對象是在If條件之前聲明和創建的。那麼,如何使用If條件檢查?換句話說,如果My_Object的<無變量> – StarDotStar

+4

我不想執行My_Object.Compute沒有看到您的代碼和對象是什麼,恐怕我不知道如何幫助您。 – aevanko

+0

一個'dict'例子!多麼驚喜:) - 很好的例子 – JMax

0

在我的示例代碼中,我將my object設置爲空,並且我無法獲取if語句的「not」部分以使用該對象。我試過if My_Object is not nothingif not My_Object is nothing。這可能只是一個語法問題,我無法弄清楚,但我沒有時間搞亂,所以我做了一個這樣的解決方法:

if My_Object is Nothing Then 
    'do nothing 
Else 
    'Do something 
End if 
+0

你的經驗幫助告訴我。我一直試圖使用'如果My_Object不是Nothing',但是你的其他表單看起來像是在正確的路徑上。你試過了嗎?如果不是(My_Object是Nothing)然後'做些什麼'? – mpag