23

以下に示すように、VBA アプリケーションには条件がありIfます。

If Not My_Object Is Nothing Then
My_Object.Compute

コードをデバッグ モードで実行すると、 「変数なし」Ifの場合でも条件が true を返すことがわかりました。My_Object

誰かがこれを説明してもらえますか? My_Object.Compute存在するときだけ実行したいMy_Object

4

3 に答える 3

26

Issun へのコメントに基づいて:

説明してくれてありがとう。私の場合、オブジェクトは If 条件の前に宣言および作成されます。では、 If 条件を使用して < No Variables> をチェックするにはどうすればよいですか? つまり、My_Object に < No Variables> がある場合、My_Object.Compute を実行したくありません。

オブジェクトのプロパティの 1 つを確認する必要があります。オブジェクトが何であるかを教えてくれなければ、私たちはあなたを助けることはできません.

いくつかの一般的なオブジェクトをテストしたところ、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 検索で見つける可能性があるため、これは初心者によくある間違いであるため、含めたいと思いました。

于 2011-12-12T15:31:32.897 に答える
11

クラスオブジェクトに変数がないからといって、それが何もないというわけではありません。オブジェクトを宣言することとオブジェクトを作成することは、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
于 2011-12-12T10:55:31.953 に答える