VBA kiểm tra xem đối tượng đã được thiết lập chưa


89

Tôi có một biến toàn cục là một phiên bản của lớp tùy chỉnh của tôi.

Làm cách nào để kiểm tra xem đối tượng đã được thiết lập chưa hoặc liệu tôi có cần khởi tạo nó hay không?

Câu trả lời:


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

Hoặc, nếu bạn thích nó theo cách khác:

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

2
Tôi biết rằng nó phải đơn giản khi tôi Google Googled nó và không tìm thấy gì! Cảm ơn bạn đã giúp đỡ!
Icode4food

3
Lưu ý rằng kiểm tra obj Is NothingKHÔNG giống như kiểm tra IsNothing(obj)! Cảm ơn các cú pháp chính xác để kiểm tra này ... không chắc chắn lý do tại sao IsNothing()cư xử khác nhau ...
Matt Browne

1
Tôi thấy Not (obj Is Nothing)dễ hiểu hơn Not obj Is Nothing. Bộ não của tôi không biết "Không phải đối tượng" là gì!
Martin F

Bạn cũng có thể viết: If obj IsNot Nothing mà tôi thấy nó rõ ràng hơn nhiều so với phần còn lại. Nó cũng kinda cảm thấy giống như C # (OJB = null!)
Alexandre

4

Cách an toàn (không) để làm điều này - nếu bạn đồng ý với việc không sử dụng tùy chọn rõ ràng - là ...

Not TypeName(myObj) = "Empty"

Điều này cũng xử lý trường hợp nếu đối tượng chưa được khai báo. Điều này hữu ích nếu bạn chỉ muốn nhận xét ra một khai báo để tắt một số hành vi ...

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

Điều này hoạt động vì VBA sẽ tự động khởi tạo một biến chưa được khai báo dưới dạng kiểu Biến thể trống. Nó loại bỏ sự cần thiết của một Boolean phụ trợ để quản lý hành vi.


4
Không ai nên có bất kỳ mã VBA nào mà không có Option Explicit. Nó không đạt được gì ngoại trừ các vấn đề. Để "chuyển đổi" hành vi, hãy sử dụng Biên dịch có điều kiện.
Andre

@andre, vâng, điểm công bằng. Tôi cảm thấy ổn khi không có nó vì tôi sử dụng ký hiệu hungarian cho phạm vi, nhưng tôi cố gắng tránh vba những ngày này nếu có thể. Hầu hết những gì tôi thấy là về khai báo rõ ràng, an toàn tên và tránh các biến thể đáng sợ. Lý do chính của bạn là gì?
Cool Blue

Trong thực tế tôi nhận được "Không có gì" như kết quả của typename, và không "Empty"
Patrick Lepelletier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.