我使用Ranges,有时删除给定对象中的所有单元格(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
答案 0 :(得分:3)
关于Daily Dose of Excel指向类似的堆栈溢出question,有一个有趣的讨论。 DDoE没有提供“解决方案”,但讨论的内容是“预期行为”。 SO帖子(由@DougGlancy提供)但它只是代码的一个版本(可能稍微好一些,因为不需要If False Then...
构造)。
IMO这里的最佳做法是记住将参考变量设置为Nothing
,如果可以的话。 E.g。
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
趋势可能是让范围处理清理(即r
在Sub
完成后将超出范围)但最好自己进行清理。