我使用范围,有时会删除给定对象中的所有单元格(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
2条答案
按热度按时间nfs0ujit1#
在Daily Dose of Excel上有一个有趣的讨论,指向一个类似的堆栈溢出question。DDoE没有给予一个“解决方案”,但讨论是关于“预期行为”的启发。SO帖子(@DougGlancy)有,但它只是你的代码的一个版本(可能稍微好一点,因为不需要
If False Then...
构造)。这里的最佳实践是记住在可以的时候将引用变量设置为
Nothing
。现在的趋势可能是让scope来处理清理工作(即,一旦
Sub
完成,r
将超出scope),但最好是自己进行清理。enxuqcxy2#
在我的例子中,我没有任何循环,因此
For ... Step -1
,正如奈杰尔Heffernan所说,不是一个解决方案。对于这个问题,正确的解决方案将取决于上下文。这是我的:
在其他上下文中,可以存储初始值 并在删除该范围内的单元格后,与新分配的
Rng
进行比较