VBA проверьте, установлен ли объект

89

У меня есть глобальная переменная, которая является экземпляром моего пользовательского класса.

Как мне проверить, установлен ли объект или мне нужно его инициализировать?

Icode4food
источник

Ответы:

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

Или, если вы предпочитаете наоборот:

If Not obj Is Nothing Then
    ' obj already set / initialized. '
Else
    ' need to initialize obj: '
    Set obj = ...
End If
stakx - больше не участвует
источник
2
Я знал, что это должно быть просто, когда погуглил и ничего не нашел! Спасибо за вашу помощь!
Icode4food
3
Обратите внимание, что проверка obj Is Nothing- это НЕ то же самое, что проверка IsNothing(obj)! Спасибо за правильный синтаксис для проверки ... не уверен, почему IsNothing()ведет себя по-другому ...
Мэтт Браун
1
Мне Not (obj Is Nothing)легче понять, чем Not obj Is Nothing. Мой мозг не знает, что такое «Not obj»!
Martin F
Вы также можете написать: If obj IsNot Nothing, что я считаю более понятным, чем остальные. Он также выглядит так же, как C # (ojb! = Null)
Alexandre
4

(Не) безопасный способ сделать это - если вы не против не использовать явную опцию - это ...

Not TypeName(myObj) = "Empty"

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

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

Это работает, потому что VBA автоматически создает экземпляр необъявленной переменной как пустой тип варианта. Это устраняет необходимость во вспомогательном логическом значении для управления поведением.

Холодный синий
источник
4
Ни у кого не должно быть кода VBA без Option Explicit. Ничего не получает, кроме проблем. Чтобы «переключить» поведение, используйте условную компиляцию.
Андре
@andre, да, справедливо. Я чувствую себя хорошо без этого, потому что я использую венгерскую нотацию для области видимости, но в наши дни я стараюсь избегать vba, если могу. Большая часть того, что я вижу, касается явных деклараций, безопасности имен и избегания ужасных вариантов. Каковы ваши основные причины?
Cool Blue
На самом деле я получаю «Ничего» в результате имени типа, а не «Пусто»
Патрик