VBA で Set キーワードを使用すると、指定したワークシート内のワークシートの Range オブジェクトへのポインターがバックグラウンドで作成されると思います (各セルは、特定の範囲のワークシートのセルのコレクション内のオブジェクトです)。メモリ内で範囲を参照している間に範囲が削除されると、Range 変数が指していたオブジェクトのメモリが解放されます。
ただし、 Range 変数には、最近削除された Range オブジェクトへのポインターが含まれている可能性が最も高いため、何もないわけではありませんが、それが指しているものはもう存在しないため、変数を再度使用しようとすると問題が発生します.
このコードをチェックして、私が何を意味するかを確認してください。
Public Sub test2()
Dim r As Excel.Range
Debug.Print ObjPtr(r) ' 0
Set r = ActiveSheet.Range("A1")
Debug.Print ObjPtr(r) ' some address
r.Value = "Hello"
r.Delete
Debug.Print ObjPtr(r) ' same address as before
End Sub
ObjPtr() の詳細については、次の記事を参照してください:
http://support.microsoft.com/kb/199 824
したがって、オブジェクトへの有効なアドレスを持っていても、残念ながらオブジェクトは削除されているため、もう存在しません。そして、「Is Nothing」はポインタ内のアドレスをチェックするだけのようです(VBAは変数が「Set」であると信じていると思います)。
この問題を回避する方法については、残念ながら現時点ではクリーンな方法は見当たりません (誰かがこれを処理するエレガントな方法を見つけた場合は、投稿してください!)。On Error Resume Next を次のように使用できます。
Public Sub test3()
Dim r As Excel.Range
Debug.Print ObjPtr(r) ' 0
Set r = ActiveSheet.Range("A1")
Debug.Print ObjPtr(r) ' some address
r.Value = "Hello"
r.Delete
Debug.Print ObjPtr(r) ' same address as before
On Error Resume Next
Debug.Print r.Value
If (Err.Number <> 0) Then
Debug.Print "We have a problem here..."; Err.Number; Err.Description
End If
On Error GoTo 0
End Sub