VBA: Условное - ничего

В приложении VBA есть условие If, как показано ниже:

If Not My_Object Is Nothing Then
My_Object.Compute

Когда код запускается в режиме отладки, я обнаружил, что условие If возвращает значение true, даже если My_Object имеет "Нет переменных".

Может ли кто-нибудь объяснить это? Я хочу, чтобы My_Object.Compute выполнялся только тогда, когда My_Object существует.

Ответы

Ответ 1

На основе вашего комментария к Issun:

Спасибо за объяснение. В моем случае объект объявляется и создается до условия If. Итак, как использовать условие If для проверки < Нет переменных > ? Другими словами, я не хочу выполнять My_Object.Compute, если My_Object имеет < Нет переменных >

Вам нужно проверить одно из свойств объекта. Не сообщая нам, что это за объект, мы не можем вам помочь.

Я проверил несколько общих объектов и обнаружил, что экземпляр Collection без добавленных элементов показывает <No Variables> в окне просмотра. Если ваш объект действительно представляет собой коллекцию, вы можете проверить условие <No Variables>, используя свойство .Count:

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, я хотел включить его, потому что это обычная ошибка начинающего.

Ответ 2

Просто потому, что у вашего объекта класса нет переменных, это не значит, что это ничего. Объявление и объект и создание объекта - это две разные вещи. Посмотрите и посмотрите, настроите/создаете объект.

Возьмем, к примеру, объект словаря - только потому, что он не содержит переменных, не означает, что он не был создан.

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

Ответ 3

В моем примере кода я ничего не установил my object, и я не мог заставить "не" часть оператора if работать с объектом. Я попробовал if My_Object is not nothing, а также if not My_Object is nothing. Это может быть просто синтаксис, который я не могу понять, но у меня не было времени, чтобы поболтать, поэтому я сделал небольшое обходное решение:

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