web-dev-qa-db-ja.com

VBA:条件付き-何もない

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

If Not My_Object Is Nothing Then
My_Object.Compute

コードをデバッグモードで実行すると、My_Objectに "変数がありません"であっても、If条件がtrueを返すことがわかりました。

誰か説明していただけますか? My_Object.Computeが存在する場合にのみMy_Objectを実行したい。

21
StarDotStar

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

説明ありがとう。私の場合、オブジェクトはIf条件の前に宣言および作成されます。したがって、If条件を使用して<変数なし>を確認するにはどうすればよいですか?つまり、My_Objectに<変数がありません>の場合、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検索でこの質問を見つけるかもしれないので、初心者のよくある間違いであるので、私はそれを含めたかったのです。

23
mwolfe02

クラスオブジェクトに変数がないからといって、それが何もないという意味ではありません。宣言とオブジェクト、およびオブジェクトの作成は、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
9
aevanko

サンプルコードでは、my object何にも、そして私はオブジェクトで動作するifステートメントの「not」部分を取得できませんでした。私は試した 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
0
WannabeProger