Search code examples
excelvbanamed-rangesrowdeleting

How Can You Delete All the Rows In a Range?


I'm new to vba, and I've written the code below but can't figure out why it's not working.

Sub DataValidationDeleteWrongOrigin()
'
'Description: Goes through and deletes rows that are called out on the delete entry column.
'


'Dimension Worksheet
Dim DataValWs As Worksheet
Set DataValWs = Worksheets("Data Validation")

'Find the size of the table and store it as LastDataRow
Dim LastDataRow As Long
LastDataRow = DataValWs.Range("A5").End(xlDown).Row


'ThisRow will be the current row as the for loop goes through each row.
Dim ThisRow As Long
Dim DeleteRange As Range
Dim CurrentRow As Range
'Start the for loop from row 5
For ThisRow = 5 To LastDataRow

    'Check the Delete Entry row to see if it says Yes, delete the row. Use DeleteRange to add cells to it and delete them all at the end (much _
    faster than deleting them one at a time, and you don't have to re-find the size of the table after each row is deleted).

    If Cells(ThisRow, 16) = "Yes" Then
        If Not DeleteRange Is Nothing Then
            Set CurrentRow = DataValWs.Rows(ThisRow)
            Set DeleteRange = Union(CurrentRow, DeleteRange)
        Else
            Set DeleteRange = DataValWs.Cells(ThisRow, 16)
        End If


    End If

Next ThisRow

'DeleteRange.Select
DeleteRange.EntireRow.Delete



End Sub

Currently, the code gives me

Run-time error 1004 : Delete method of Range class failed.

The "DeleteRange.Select" that is commented out near the end of the code selects the correct range, so I know the range is being built accurately.

I want to be able to just drop all of the rows to be deleted off of the sheet at once --the number of rows to be deleted could get pretty high in this application, and I'd prefer it not take forever to run.

I've looked around online, and found a couple of solutions that involve going through the DeleteRange iteratively and deleting each row out of it, but that gives me the same problem of deleting rows one at a time. Is there a better way to handle this? Or, better yet, have I messed up in defining the DeleteRange?

Thank you!

Edit:

Did some testing with different sets of rows, and it turns out it has no problem deleting the rows if they're all adjacent to each other. Only results in the run time error if the rows have gaps between them...


Solution

  • I could replicate your problem only when there was an object at the side of the range (i.e. a ListObject )

    enter image description here

    Check the data in your worksheet and if that is the case use rDelete.Delete Shift:=xlUp

    Assuming your DATA is located in the range A5:P# (where # is the last row of data) use this code.

    Sub Delete_Rows()
    Dim ws As Worksheet
    Dim rDelete As Range
    Dim rData As Range, rRow As Range, lRw As Long
    
        Set ws = Worksheets("Data Validation")
        With ws
            lRw = .Range("A5").End(xlDown).Row
            Set rData = Range(.Range("A5"), Range("P" & lRw))    'adjust as required
        End With
    
        For Each rRow In rData.Rows
            If rRow.Cells(16) = "Yes" Then
                If rDelete Is Nothing Then
                    Set rDelete = rRow
    
                Else
                    Set rDelete = Union(rDelete, rRow)
    
        End If: End If: Next
    
        rDelete.Delete Shift:=xlUp
    
        End Sub