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


89

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

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

Ответы:


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

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

На самом деле я получаю «Ничего» в результате имени типа, а не «Пусто»
Патрик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.