VBA: условно - ничего - PullRequest
       28

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

21 голосов
/ 12 декабря 2011

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

If Not My_Object Is Nothing Then
My_Object.Compute

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

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

Ответы [ 3 ]

23 голосов
/ 12 декабря 2011

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

9 голосов
/ 12 декабря 2011

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

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

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 голосов
/ 07 октября 2016

В моем примере кода я установил my object в ноль, и я не мог заставить часть "not" оператора 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
...