2017-06-13 111 views
0

我有這個非常簡單的VBA代碼,我用它來查找列中的某些文本並擦除整行。但由於某種原因,我每次運行它給我這個錯誤:運行時錯誤'424':所需的對象運行時錯誤424 - 所需的對象

任何線索?

Sub DeleteText() 
    Dim c As Range 
    Dim sArray(1 To 4) As String 
    sArray(1) = "TEXT 1" 
    sArray(2) = "TEXT 2" 
    sArray(3) = "TEXT 3" 
    sArray(4) = "TEXT 4" 
    Dim SrchRng 

    Set SrchRng = ActiveSheet.Range("A1", ActiveSheet.Range("A65536").End(xlUp)) 

    For i = 1 To 4 

    Do 
     Set c = SrchRng.Find(What:=sArray(i), LookIn:=xlValues) ' <-- IT STOPS IN THIS LINE 
     If Not c Is Nothing Then c.EntireRow.Delete 
    Loop While Not c Is Nothing 
    Next i 
End Sub 
+0

不知道,它只是對我很好。 –

+0

奇怪的行爲:如果我選擇一個表中不存在的文本,它將顯示沒有錯誤。但只要我選擇了一個存在的文本,錯誤就會回來。 –

+1

當您刪除行時,您會更改'SrchRng'指向的內容:最終您可能會刪除所有單元格,因此它不再是有效的範圍引用。一旦你達到那個點,任何對'SrchRange'的引用都會引發一個錯誤。 –

回答

1

當你刪除你改變什麼行SrchRng點:最終你可以得到你已經刪除了所有的細胞的點,所以它不再是一個有效的範圍內引用。一旦你達到這一點,任何對SrchRange的引用都會引發錯誤。

你可以只收集要刪除的行,你循環,然後刪除它們全都在結尾處:

Sub DeleteText() 

    Dim c As Range 
    Dim sArray(1 To 4) As String, i As Long 
    sArray(1) = "TEXT 1" 
    sArray(2) = "TEXT 2" 
    sArray(3) = "TEXT 3" 
    sArray(4) = "TEXT 4" 
    Dim SrchRng As Range, rngDelete As Range 

    Set SrchRng = ActiveSheet.Range("A1", ActiveSheet.Range("A65536").End(xlUp)) 

    For i = 1 To 4 

    Do 
     'NOTE: use LookAt to ensure you're not making a partial match 
     ' Unless you want that... 
     Set c = SrchRng.Find(What:=sArray(i), LookIn:=xlValues, lookat:=xlWhole) 
     If Not c Is Nothing Then 
      c.Value = "" '<< so it's not found again 
      'build up a range of cells to delete 
      If rngDelete Is Nothing Then 
       Set rngDelete = c 
      Else 
       Set rngDelete = Application.Union(c, rngDelete) 
      End If 
     End If 
    Loop While Not c Is Nothing 
    Next i 

    'delete any found rows 
    If Not rngDelete Is Nothing Then rngDelete.EntireRow.Delete 

End Sub 
+0

工作完美,謝謝!我只需將範圍更改爲Z65536,以便查看所有列。有關如何跳過前兩行(標題)的任何建議? –

+0

'Set SrchRng = ActiveSheet.Range(「A3」,ActiveSheet.Range(「Z65536」)。End(xlUp))' –

相關問題