2017-09-05 44 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,因爲引用無效。所以你不能返回地址 –