2011-12-12 47 views
16

Có một tình trạng If trong một ứng dụng VBA như bên dưới:VBA: Conditional - Is Nothing

If Not My_Object Is Nothing Then 
My_Object.Compute 

Khi mã được chạy trong chế độ gỡ lỗi, tôi thấy rằng điều kiện If trả về một sự thật ngay cả khi My_Object có "Không có biến".

Ai đó có thể giải thích điều này? Tôi muốn My_Object.Compute chỉ được thực thi khi có My_Object.

+2

'My_Object' được khai báo như thế nào? – GSerg

+2

Bạn có thể làm rõ ý nghĩa của từ "không biến" không?Nếu My_Object là Nothing, nó chắc chắn có nghĩa là nó không trỏ đến một đối tượng. Ngoài ra, định nghĩa kiểu của My_Object là gì? –

+1

"Tôi muốn My_Object.Compute chỉ được thực thi khi My_Object tồn tại." Mong muốn của bạn được cấp theo đây. (Có nghĩa là, là có bất kỳ kịch bản mà điều này sẽ * không * là trường hợp?) –

Trả lời

16

Dựa trên nhận xét của bạn để Issun:

Cảm ơn lời giải thích. Trong trường hợp của tôi, đối tượng được khai báo và tạo trước điều kiện If. Vì vậy, Làm cách nào để sử dụng Nếu điều kiện để kiểm tra < Không có biến>? Nói cách khác, tôi không muốn thực thi My_Object.Compute nếu My_Object có < Không có biến>

Bạn cần kiểm tra một trong các thuộc tính của đối tượng. Nếu không nói cho chúng tôi biết đối tượng là gì, chúng tôi không thể giúp bạn.

Tôi đã thử nghiệm một số đối tượng phổ biến và nhận thấy rằng đã xuất hiện Collection không có mặt hàng nào được hiển thị <No Variables> trong cửa sổ xem. Nếu đối tượng của bạn thực sự là một bộ sưu tập, bạn có thể kiểm tra các điều kiện <No Variables> sử dụng .Count tài sản:

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 

Nó cũng đáng chú ý là nếu bạn khai báo bất kỳ đối tượng As New sau đó kiểm tra Is Nothing trở nên vô dụng. Lý do là khi bạn khai báo một đối tượng As New thì nó sẽ được tạo tự động khi nó được gọi đầu tiên, ngay cả khi lần đầu tiên bạn gọi nó là để xem nó có tồn tại hay không!

Dim MyObject As New Collection 
If MyObject Is Nothing Then ' <--- This check always returns False 

Điều này dường như không phải là nguyên nhân gây ra sự cố cụ thể của bạn. Nhưng, vì những người khác có thể tìm thấy câu hỏi này thông qua tìm kiếm của Google, tôi muốn đưa nó vào bởi vì đó là lỗi thường gặp của người mới bắt đầu.

+0

Tương tự, theo logic này, người ta sẽ kiểm tra '.Value' của một thuộc tính, hơn chính đối tượng, vì dĩ nhiên đối tượng được khởi tạo, tồn tại, và do đó' không phải là Không có gì cả. Tôi ngoại suy điều đó từ câu trả lời này và giải quyết một vấn đề mà tôi gặp phải tương tự như OP đang cố gắng kiểm tra một giá trị chuỗi rỗng, mà tôi phải làm với '<>" "', không phải là bài kiểm tra 'Không có gì '. Cảm ơn - câu trả lời tuyệt vời. – vapcguy

6

Chỉ vì đối tượng lớp của bạn không có biến không có nghĩa là nó không là gì cả. Khai báo và đối tượng và tạo một đối tượng là hai thứ khác nhau. Xem và xem bạn có đang thiết lập/tạo đối tượng hay không.

Lấy ví dụ đối tượng từ điển - chỉ vì nó không chứa biến không có nghĩa là nó chưa được tạo.

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 

Tuy nhiên nếu bạn khai báo một đối tượng nhưng không bao giờ tạo ra nó, thì không có gì.

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

Cảm ơn lời giải thích. Trong trường hợp của tôi, đối tượng được khai báo và tạo trước điều kiện If. Vì vậy, Làm cách nào để sử dụng Nếu điều kiện để kiểm tra ? Nói cách khác, tôi không muốn thực thi My_Object.Compute nếu My_Object có StarDotStar

+4

Nếu không nhìn thấy mã của bạn và đối tượng là gì, tôi sợ tôi không biết cách giúp bạn về điều đó. – aevanko

+0

Ví dụ 'dict'! Điều ngạc nhiên :) - ví dụ tốt theo cách – JMax

0

Trong mã mẫu, tôi đã đặt my object thành không có gì và tôi không thể nhận được phần "không" của câu lệnh if để làm việc với đối tượng. Tôi đã thử if My_Object is not nothing và cũng if not My_Object is nothing. Nó có thể chỉ là một điều cú pháp tôi không thể tìm ra nhưng tôi không có thời gian để làm rối tung xung quanh, vì vậy tôi đã giải quyết một chút như sau:

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

Trải nghiệm của bạn đã giúp tôi thông báo. Tôi đã cố gắng sử dụng 'Nếu My_Object không phải là Nothing' cũng vậy, nhưng hình thức khác của bạn trông giống như nó đang đi đúng hướng. Bạn đã thử 'If Not (My_Object is Nothing) rồi 'Làm gì đó'? – mpag