识别空"范围"删除后

时间:2017-09-05 09:08:28

标签: excel-vba vba excel

我使用Ranges,有时删除给定对象中的所有单元格(Range.Cells.Delete

我已经玩过并找到了这些:

  • 删除所有单元格后,变量类型仍为RangeIs 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

1 个答案:

答案 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

趋势可能是让范围处理清理(即rSub完成后将超出范围)但最好自己进行清理。