我相信,当您在 VBA 中使用 Set 关键字时,它会在后台创建一个指向您指定的工作表中工作表的 Range 对象的指针(每个单元格都是给定 Range 的 Worksheet 的 Cells 集合中的一个对象)。当您仍在内存中引用范围时删除范围时,范围变量指向的对象的内存已被释放。
但是,您的 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
因此,虽然您拥有对象的有效地址,但不幸的是,该对象已被删除,因此不再存在。似乎“什么都没有”只是检查指针中的地址(我认为 VBA 认为该变量是“设置”)。
至于如何解决这个问题,不幸的是我目前没有看到一种干净的方法(如果有人确实找到了一种优雅的方法来处理这个问题,请发布它!)。您可以像这样使用 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