オブジェクトが設定されているかどうかを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 2010

3
チェックobj Is Nothingはチェックと同じではないことに注意してくださいIsNothing(obj)!これをチェックするための正しい構文をありがとう...ないように注意してくださいなぜIsNothing()振る舞い異なっ...
マット・ブラウン

1
Not (obj Is Nothing)より理解しやすいと思いますNot obj Is Nothing。私の脳は「Notobj」が何であるかを知りません!
マーティン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

実際、typenameの結果として「Empty」ではなく「Nothing」が表示されます
PatrickLepelletier19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.