2017-09-05 26 views
4

我在一个给定的对象范围,有时所有细胞的活动被删除(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

'If False Then'是什么想法?避免'退出功能'?如果确实如此,请阅读本文 - > http://www.cpearson.com/excel/errorhandling.htm并遵循实践。 – Vityata

+0

这个想法是保持代码的逻辑流程。我知道在函数的末尾放置错误处理程序,通常我会这样做,但是在这种情况下(我想使用'If',但VBA不允许我)使用此构造。这很容易阅读(至少对我而言) –

回答

3

有这个上Daily Dose of Excel一个有趣的讨论指着一个类似的堆栈溢出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 

的趋势可能是让范围处理的清理(即r会走出去的范围,一旦Sub完成),但它是更好地做清理自己。

+0

感谢您的建议。 “把你的引用变量设置为'Nothing'” - 是的,这会很好,但是在我真正的代码中,我逐行删除了一部分('r.Rows(r.Rows.Count).Delete')并且总是检查我是否'只有一行剩余似乎是矫枉过正的(但是就像我写它我可能会实现此方法)。 –

+0

如果我因任何原因返回地址?在这种情况下是否无法从变量中获取? – Moacir

+1

所有属性都是错误424,因为引用无效。所以你不能返回地址 –