我使用范围,有时给定对象中的所有单元格都会被删除 (Range.Cells.Delete
)
我玩过并发现了这些:
- 删除所有单元格后,变量类型仍为
Range
并且Is Not Nothing
- 调用其任何成员都会导致错误“需要对象”
这是我的小子来测试它:
Sub test()
Dim r As Range
Debug.Print r Is Nothing ' -> true
Set r = ActiveSheet.Range("a2")
Debug.Print TypeName(r) ' -> Range
r.Cells.Delete shift:=xlShiftUp
On Error GoTo ErrHandler
Debug.Print r Is Nothing ' -> False
Debug.Print TypeName(r) ' -> Range
Debug.Print r.Address ' -> "Err: Object required"
Debug.Print r.Cells.Count ' -> "Err: Object required"
Exit Sub
ErrHandler:
MsgBox "Err: " & Err.Description
Resume Next
End Sub
我的问题是:如何确定(希望没有错误处理)对象是否为空 Range
?
到目前为止我找到的最短选项:
Function IsEmptyRange(testRange As Range) As Boolean
If TypeName(testRange) <> "Range" Then
IsEmptyRange = False
Else
On Error GoTo EmptyRange
IsEmptyRange = testRange.Cells.Count = 0
If False Then
EmptyRange:
Err.Clear
IsEmptyRange = True
End If
End If
End Function
最佳答案
Daily Dose of Excel 上对此有一个有趣的讨论。指向类似的 Stack Overflow question 。 DDoE 没有给出“解决方案”,但关于“预期行为”的讨论很有启发性。 SO 帖子确实如此(作者:@DougGlancy),但它只是代码的一个版本(可能稍微好一点,因为不需要 If False then...
构造)。
在我看来,这里的最佳实践是记住在可以的情况下将引用变量设置为 Nothing
。例如
Sub test()
Dim r As Range
Debug.Print r Is Nothing ' -> true
Set r = ActiveSheet.Range("a2")
Debug.Print TypeName(r) ' -> Range
r.Cells.Delete shift:=xlShiftUp
Set r = Nothing ' -> end of problem
On Error GoTo ErrHandler
Debug.Print r Is Nothing ' -> True
If Not r Is Nothing Then
Debug.Print TypeName(r) ' -> Range
Debug.Print r.Address ' -> "Err: Object required"
Debug.Print r.Cells.Count ' -> "Err: Object required"
End If
Exit Sub
ErrHandler:
MsgBox "Err: " & Err.Description
Resume Next
End Sub
趋势可能是让作用域处理清理工作(即,一旦 Sub
完成,r
将超出作用域),但最好这样做自己清理。
关于excel - 删除后识别为空 "Range",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46051135/