Delete all rows in excel vba

Just recently I’ve been trying to delete all data rows in a table, apart from the first (which needs to just be cleared)

Some of the tables being actioned could already have no rows, so I was running it to problems as using .DataBodyRange.Rows.Count on a table with no rows (just header and/or footer) causes errors.

I looked all over for a solution an could not find a whole one, so I hope my answer to this question will be useful to others in the future.

Siddharth Rout's user avatar

asked Dec 18, 2013 at 16:33

David Gard's user avatar

David GardDavid Gard

10.9k35 gold badges112 silver badges216 bronze badges

1

This is how I clear the data:

Sub Macro3()
    With Sheet1.ListObjects("Table1")
        If Not .DataBodyRange Is Nothing Then
            .DataBodyRange.Delete
        End If
    End With
End Sub

oldtechaa's user avatar

oldtechaa

1,4631 gold badge17 silver badges26 bronze badges

answered Jul 2, 2016 at 16:39

royUK's user avatar

2

Your code can be narrowed down to

Sub DeleteTableRows(ByRef Table As ListObject)
    On Error Resume Next
    '~~> Clear Header Row `IF` it exists
    Table.DataBodyRange.Rows(1).ClearContents
    '~~> Delete all the other rows `IF `they exist
    Table.DataBodyRange.Offset(1, 0).Resize(Table.DataBodyRange.Rows.Count - 1, _
    Table.DataBodyRange.Columns.Count).Rows.Delete
    On Error GoTo 0
End Sub

Edit:

On a side note, I would add proper error handling if I need to intimate the user whether the first row or the other rows were deleted or not

David Gard's user avatar

David Gard

10.9k35 gold badges112 silver badges216 bronze badges

answered Dec 18, 2013 at 16:42

Siddharth Rout's user avatar

Siddharth RoutSiddharth Rout

146k17 gold badges206 silver badges250 bronze badges

2

I have 3 routines which work just fine, just select a cell in a table and run one of the subroutines

Sub ClearTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.DataBodyRange.Rows.ClearContents
End If
End Sub

and Shrink Table to remove the databody range except from the headers and the first data row

Sub ShrinkTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.DataBodyRange.Delete
End If
End Sub

and Delete Table to completely delete the table from the sheet

Sub DeleteTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.Delete
End If
End Sub

answered Jan 10, 2017 at 12:41

Erik's user avatar

ErikErik

1011 silver badge3 bronze badges

1

I wanted to keep the formulas in place, which the above code did not do.

Here’s what I’ve been doing, note that this leaves one empty row in the table.

Sub DeleteTableRows(ByRef Table As ListObject, KeepFormulas as boolean)

On Error Resume Next

if not KeepFormulas then
    Table.DataBodyRange.clearcontents
end if

Table.DataBodyRange.Rows.Delete

On Error GoTo 0

End Sub

(PS don’t ask me why!)

carlodurso's user avatar

carlodurso

2,8864 gold badges24 silver badges37 bronze badges

answered Jan 2, 2015 at 21:27

HarveyFrench's user avatar

HarveyFrenchHarveyFrench

4,4104 gold badges20 silver badges35 bronze badges

I’m simply using this:

On Error Resume Next
Worksheets("Sheet1").ListObjects("Table1").DataBodyRange.Rows.Delete

The first line stays in all cases (it is cleared, of course).

answered Aug 2, 2020 at 16:34

Dom's user avatar

Would this work for you? I’ve tested it in Excel 2010 and it works fine.
This is working with a table called «Table1» that uses columns A through G.

Sub Clear_Table()
    Range("Table1").Select
    Application.DisplayAlerts = False
    Selection.Delete
    Application.DisplayAlerts = True
    Range("A1:G1").Select
    Selection.ClearContents
End Sub

answered Nov 17, 2014 at 19:08

Jack McCoy's user avatar

This VBA Sub will delete all data rows (apart from the first, which it will just clear) —

Sub DeleteTableRows(ByRef Table as ListObject)

        '** Work out the current number of rows in the table
        On Error Resume Next                    ' If there are no rows, then counting them will cause an error
        Dim Rows As Integer
        Rows = Table.DataBodyRange.Rows.Count   ' Cound the number of rows in the table
        If Err.Number <> 0 Then                 ' Check to see if there has been an error
            Rows = 0                            ' Set rows to 0, as the table is empty
            Err.Clear                           ' Clear the error
        End If
        On Error GoTo 0                         ' Reset the error handling

        '** Empty the table *'
        With Table
            If Rows > 0 Then ' Clear the first row
                .DataBodyRange.Rows(1).ClearContents
            End If
            If Rows > 1 Then ' Delete all the other rows
                .DataBodyRange.Offset(1, 0).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
            End If
        End With

End Sub

Siddharth Rout's user avatar

answered Dec 18, 2013 at 16:33

David Gard's user avatar

David GardDavid Gard

10.9k35 gold badges112 silver badges216 bronze badges

4

I suggest first clearcontents, then resize Table:

Sub DeleteTableRows(ByRef Table As ListObject)

     Dim R               As Range

On Error Resume Next

    Table.DataBodyRange.ClearContents
    Set R = Table.Range.Rows(1).Resize(2)
    Table.Resize R

On Error GoTo 0

End Sub

answered Sep 24, 2015 at 13:46

Max Makhrov's user avatar

Max MakhrovMax Makhrov

16.8k5 gold badges54 silver badges78 bronze badges

The codes above wouldn’t work in Excel 2010
My code bellow allows you to go through number of sheets you would like then select tables and delete rows

Sub DeleteTableRows()
Dim table As ListObject
Dim SelectedCell As Range
Dim TableName As String
Dim ActiveTable As ListObject

'select ammount of sheets want to this to run
For i = 1 To 3
    Sheets(i).Select
    Range("A1").Select
    Set SelectedCell = ActiveCell
    Selection.AutoFilter

    'Determine if ActiveCell is inside a Table
    On Error GoTo NoTableSelected
    TableName = SelectedCell.ListObject.Name
    Set ActiveTable = ActiveSheet.ListObjects(TableName)
    On Error GoTo 0

    'Clear first Row
    ActiveTable.DataBodyRange.Rows(1).ClearContents
    'Delete all the other rows `IF `they exist
    On Error Resume Next
    ActiveTable.DataBodyRange.Offset(1, 0).Resize(ActiveTable.DataBodyRange.Rows.Count - 1, _
    ActiveTable.DataBodyRange.Columns.Count).Rows.Delete
    Selection.AutoFilter
    On Error GoTo 0
Next i
Exit Sub
'Error Handling
NoTableSelected:
  MsgBox "There is no Table currently selected!", vbCritical

End Sub

answered Sep 20, 2017 at 8:25

Tariq Khalaf's user avatar

Tariq KhalafTariq Khalaf

891 gold badge1 silver badge10 bronze badges

If you already know the table name in advance, this is a short approach I’d use

With [TableName].ListObject
    If Not .DataBodyRange Is Nothing Then: .DataBodyRange.Delete
End With

No need for sheet reference etc.

answered Sep 24, 2022 at 10:02

milo5m's user avatar

milo5mmilo5m

6191 gold badge3 silver badges8 bronze badges

In this VBA Tutorial, you learn how to use Excel VBA to delete rows based on a variety of criteria.Excel VBA Tutorial about how to delete rows with macros

This VBA Tutorial is accompanied by Excel workbooks containing the data and macros I use in the examples below. You can get immediate free access to these example workbooks by subscribing to the Power Spreadsheets Newsletter.

Use the following Table of Contents to navigate to the section you’re interested in.

Related VBA and Macro Tutorials

The following VBA and Macro Tutorials may help you better understand and implement the contents below.

  • General VBA constructs and structures:
    • Learn about using variables here.
    • Learn about VBA data types here.
    • Learn about R1C1 style-references here.
    • Learn about using worksheet functions in VBA here.
  • Practical VBA applications and macro examples:
    • Learn how to work with worksheets here.
    • Learn how to insert rows here.
    • Learn how to delete columns here.
    • Learn how to find the last column in a worksheet here.

You can find additional VBA and Macro Tutorials in the Archives.

VBA Code to Delete a Row

To delete a row using VBA, use a statement with the following structure:

Worksheets.Rows(Row#).Delete

Process Followed by VBA Code

Identify row to delete > Delete row

VBA Statement Explanation

Worksheets.Rows(Row#).Delete

  1. Item: Worksheets.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Rows(Row#).
    • VBA Construct: Worksheet.Rows property.
    • Description: Returns a Range object representing row number Row# of the worksheet returned by item #1 above.

      If you explicitly declare a variable to represent Row#, use the Long data type.

  3. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #2 above.

Macro Example

The following macro deletes row 6 of the worksheet named “Delete row”.

Sub deleteRow()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/
 
    Worksheets("Delete row").Rows(6).Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes row 6 of the worksheet.

Macro deletes row 6

#2: Delete a Row and Shift Up

VBA Code to Delete a Row and Shift Up

To delete a row and explicitly shift cells up to replace the deleted row, use a statement with the following structure:

Worksheet.Rows(Row#).Delete Shift:=xlShiftUp

Process Followed by VBA Code

Identify row to delete > Delete row and shift cells up

VBA Statement Explanation

Worksheet.Rows(Row#).Delete Shift:=xlShiftUp

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Rows(Row#).
    • VBA Construct: Worksheet.Rows property.
    • Description: Returns a Range object representing row number Row# of the worksheet returned by item #1 above.

      If you explicitly declare a variable to represent Row#, use the Long data type.

  3. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #2 above.
  4. Item: Shift:=xlShiftUp.
    • VBA Construct: Shift parameter of the Range.Delete method.
    • Description:
      • Shifts rows up (xlShiftUp) to replace the deleted row.
      • You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When deleting a row, this generally results in Excel shifting the cells up.

Macro Example

The following macro deletes row 10 of the worksheet named “Delete row” and explicitly specifies to shift cells up to replace the deleted row.

Sub deleteRowShiftUp()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/
 
    Worksheets("Delete row").Rows(10).Delete Shift:=xlShiftUp

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes row 10 of the worksheet and shifts cells up to replace the deleted row.

Macro deletes row 10 and shift cells up

#3: Delete Multiple Rows

VBA Code to Delete Multiple Rows

To delete multiple rows, use a statement with the following structure:

Worksheet.Rows("FirstRow#:LastRow#").Delete

Process Followed by VBA Code

Identify rows to delete > Delete rows

VBA Statement Explanation

Worksheet.Rows(“FirstRow#:LastRow#”).Delete

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Rows(“FirstRow#:LastRow#”).
    • VBA Construct: Worksheet.Rows property.
    • Description: Returns a Range object representing rows number FirstRow# through LastRow# of the worksheet returned by item #1 above.
  3. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #2 above.

Macro Example

The following macro deletes rows 14 to 18 of the worksheet named “Delete row”.

Sub deleteMultipleRows()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/
 
    Worksheets("Delete row").Rows("14:18").Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes rows 14 to 18 of the worksheet.

Macro deletes rows 14 to 18

#4: Delete Selected Row

VBA Code to Delete Selected Row

To delete the selected row (the row containing the active cell), use the following statement:

ActiveCell.EntireRow.Delete

Process Followed by VBA Code

Identify active cell > Return entire row > Delete row

VBA Statement Explanation

ActiveCell.EntireRow.Delete

  1. Item: ActiveCell.
    • VBA Construct: Application.ActiveCell property.
    • Description: Returns a Range object representing the active cell.
  2. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire row containing the cell range returned by item #1 above.
  3. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #2 above.

Macro Example

The following macro deletes the selected row (the row containing the active cell):

Sub deleteSelectedRow()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/
 
    ActiveCell.EntireRow.Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. When I execute the macro, the active cell is B20. As expected, Excel deletes the selected row.

Macro deletes selected row

#5: Delete Multiple Selected Rows

VBA Code to Delete Multiple Selected Rows

To delete multiple selected rows, use the following statement:

Selection.EntireRow.Delete

Process Followed by VBA Code

Identify selected cells > Return entire rows > Delete rows

VBA Statement Explanation

Selection.EntireRow.Delete

  1. Item: Selection.
    • VBA Construct: Application.Selection property.
    • Description: Returns a Range object representing the current cell range selection.
  2. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire row containing the Range object returned by item #1 above.
  3. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #2 above.

Macro Example

The following macro deletes the (multiple) selected rows.

Sub deleteSelectedRows()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/
 
    Selection.EntireRow.Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. When I execute the macro, the selected cells are B24 to B28. As expected, Excel deletes the selected rows.

Macro deletes selected rows

#6: Delete Blank Rows

VBA Code to Delete Blank Rows

To delete blank rows, use a macro with the following statement structure:

With Worksheet
    For Counter = LastRow To FirstRow Step -1
        If WorksheetFunction.CountA(.Rows(Counter)) = 0 Then
            If Not BlankRows Is Nothing Then
                Set BlankRows = Union(BlankRows, .Rows(Counter))
            Else
                Set BlankRows = .Rows(Counter)
            End If
        End If
    Next Counter
End With
If Not BlankRows Is Nothing Then BlankRows.Delete

Process Followed by VBA Code

Loop through all rows > Is row empty? > Add row to variable representing empty rows > Delete rows

VBA Statement Explanation

Lines #1 and #11: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines #2 through #10 below) are executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Lines #2 and #10: For Counter = LastRow To FirstRow Step -1 | Next Counter

  1. Item: For… Next Counter.
    • VBA Construct: For… Next statement.
    • Description: Repeats the statements within the loop (lines #3 through #9 below) for each row between (and including) FirstRow (item #4 below) and LastRow (item #3 below).
  2. Item: Counter.
    • VBA Construct: Counter of For… Next statement.
    • Description: Loop counter. If you explicitly declare a variable to represent the loop counter, use the Long data type.
  3. Item: LastRow.
    • VBA Construct: Counter Start of For… Next statement.
    • Description: Number of the last row (further down the worksheet) you want the macro to consider when identifying blank rows. The number of the last row is also the initial value of Counter (item #2 above).

      If you explicitly declare a variable to represent the number of the last row to consider, use the Long data type.

  4. Item: FirstRow.
    • VBA Construct: Counter End of For… Next statement.
    • Description: Number of the first row (closer to the top of the worksheet) you want the macro to consider when identifying blank rows. The number of the first row is also the final value of Counter (item (#2 above).

      If you explicitly declare a variable to represent the number of the first row to consider, use the Long data type.

  5. Item: Step -1.
    • VBA Construct: Step of For… Next statement.
    • Description: Amount by which Counter (item #2 above) changes every time a loop iteration occurs.

      In this scenario, you loop backwards: from LastRow (item #3 above) to FirstRow (item #4 above). Therefore, step is -1.

Line #3: If WorksheetFunction.CountA(.Rows(Counter)) = 0 Then

  1. Item: If… Then.
    • VBA Construct: Opening line of If… Then… Else statement.
    • Description: Conditionally executes the statements within the If… Then block (lines #4 through #8 below) if the condition specified by item #4 below is met.
  2. Item: WorksheetFunction.CountA.
    • VBA Construct: WorksheetFunction.CountA method.
    • Description: Counts the number of cells that aren’t empty in the range returned by item #3 below.

      Since the range returned by item #3 below represents the row through which the macro is currently looping, Worksheet.CountA counts the number of cells that aren’t empty in that row.

  3. Item: .Rows(Counter).
    • VBA Construct: Worksheet.Rows property.
    • Description: Returns a Range object representing the row through which the macro is currently looping.
  4. Item: WorksheetFunction.CountA(.Rows(Counter)) = 0.
    • VBA Construct: Condition of If… Then… Else statement.
    • Description: This condition is a numeric expression that evaluates to True or False, as follows:
      • True: When the WorksheetFunction.CountA method (item #2 above) returns 0. This happens when the row through which the macro is currently looping (item #3 above) is empty and, therefore, the number of non-empty cells is 0.
      • False: When WorksheetFunction.CountA returns a number other than 0. This happens when the row through which the macro is currently looping isn’t empty and, therefore, the number of non-empty cells isn’t 0.

Line #4: If Not BlankRows Is Nothing Then

  1. Item: If… Then.
    • VBA Construct: Opening line of If… Then… Else statement.
    • Description: Conditionally executes the statement within the If… Then… Else block (line #5 below) if the condition specified by item #6 below is met.
  2. Item: Not.
    • VBA Construct: Not operator.
    • Description: Carries out a logical negation on item #3 below. In other words, if item #3 returns:
      • True, the result is False.
      • False, the result is True.
  3. Item: BlankRows.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the empty rows found by the macro.
  4. Item: Is.
    • VBA Construct: Is Operator.
    • Description: Compares 2 object reference variables: (i) Not BlankRows (items #2 and #3 above) vs. (ii) Nothing (item #5 below).

      If both object references refer to the same object, the Is operator returns True. If they refer to different objects, Is returns False.

  5. Item: Nothing.
    • Description: The default value for a data type. In the case of an object variable (such as BlankRows), a null reference.
  6. Item: Not BlankRows Is Nothing.
    • VBA Construct: Condition of If… Then… Else statement.
    • Description: The condition is an expression that evaluates to True or False, as follows:
      • True: When “Not BlankRows” (items #2 and #3 above) refers to the same object as Nothing (item #5 above). This happens when BlankRows is “something”.

        Since BlankRows holds a Range object representing cell ranges within the empty rows found by the macro, BlankRows is something if the macro finds at least one such row.

      • False: When “Not BlankRows” refers to a different object from Nothing. This happens when BlankRows itself is Nothing. This occurs prior to the macro finding the first empty row. This is because BlankRows isn’t assigned to anything prior to that moment.

Line #5: Set BlankRows = Union(BlankRows, .Rows(Counter))

  1. Item: Set… =.
    • VBA Construct: Set statement.
    • Description: Assigns the object reference returned by item #6 below to BlankRows (item #2 below).
  2. Item: BlankRows.
    • VBA Construct: Object (Range) variable of Set statement.
    • Description:
      • Holds a Range object representing the empty rows found by the macro.
      • BlankRows is included twice in the statement. In the first mention (Set BlankRows), BlankRows is the object variable to which an object reference is assigned.
  3. Item: Union.
    • VBA Construct: Application.Union method.
    • Description: Returns a Range object representing the union of the Range objects returned by items #4 and #5 below.
  4. Item: BlankRows.
    • VBA Construct: Object (Range) variable.
    • Description:
      • Holds a Range object representing the empty rows found by the macro.
      • BlankRows is included twice in the statement. In the second mention (Union(BlankRows, .Rows(Counter)), BlankRows is one of the parameters of the Application.Union method.
  5. Item: .Rows(Counter).
    • VBA Construct: Worksheet.Rows property.
    • Description: Returns a Range object representing the row through which the macro is currently looping.
  6. Item: Union(BlankRows, .Rows(Counter).
    • VBA Construct: Object expression of Set statement.
    • Description: Returns the new Range object reference assigned to the BlankRows object variable (item #2 above). This is the union of the following 2 Range objects:
      • Prior to the Set statement, BlankRows represents cell ranges within the empty rows found by the macro prior to the row through which it’s currently looping.
      • “.Rows(Counter)” represents the row through which the macro is currently looping.

      Graphically, this looks as follows:

      Union(BlankRows, .Rows(Counter))

      In other words, any empty row the macro finds is “added” to BlankRows.

Line #6: Else

  1. Item: Else.
    • VBA Construct: Else clause of If… Then… Else statement.
    • Description: The statement following the Else clause (line #7 below) is executed if the condition tested in the opening line of the If… Then… Else statement (line #4 above) isn’t met and returns False.

Line #7: Set BlankRows = .Rows(Counter)

  1. Item: Set… =.
    • VBA Construct: Set statement.
    • Description: Assigns the object reference returned by item #3 below to BlankRows (item #2 below).
  2. Item: BlankRows.
    • VBA Construct: Object (Range) variable of Set statement.
    • Description: Holds a Range object representing the empty rows found by the macro.
  3. Item: .Rows(Counter).
    • VBA Construct: Worksheet.Rows property.
    • Description: Returns a Range object representing the row through which the macro is currently looping.

Lines #8 and #9: End If | End If

  1. Item: End If.
    • VBA Construct: Closing lines of If… Then… Else statements.
    • Description: Ends the If… Then… Else statements that began in lines #3 and #4 above.

Line #12: If Not BlankRows Is Nothing Then BlankRows.Delete

  1. Item: If… Then.
    • VBA Construct: If… Then… Else statement.
    • Description: Conditionally executes the statement at the end of the line (items #7 and #8 below) if the condition specified by item #6 below is met.
  2. Item: Not.
    • VBA Construct: Not operator.
    • Description: Carries out a logical negation on item #3 below. In other words, if item #3 returns:
      • True, the result is False.
      • False, the result is True.
  3. Item: BlankRows.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the empty rows found by the macro.
  4. Item: Is.
    • VBA Construct: Is Operator.
    • Description: Compares 2 object reference variables: (i) Not BlankRows (items #2 and #3 above) vs. (ii) Nothing (item #5 below).

      If both object references refer to the same object, the Is operator returns True. If they refer to different objects, Is returns False.

  5. Item: Nothing.
    • Description: The default value for a data type. In the case of an object variable (such as BlankRows), a null reference.
  6. Item: Not BlankRows Is Nothing.
    • VBA Construct: Condition of If… Then… Else statement.
    • Description: The condition is an expression that evaluates to True or False, as follows:
      • True: When “Not BlankRows” (items #2 and #3 above) refers to the same object as Nothing (item #5 above). This happens when BlankRows is “something”.

        Since BlankRows holds a Range object representing cell ranges within the empty rows found by the macro, BlankRows is something if the macro has found at least 1 empty row.

      • False: When “Not BlankRows” refers to a different object from Nothing. This happens when BlankRows itself is Nothing. This, in turn, occurs when the macro founds no empty rows.
  7. Item: BlankRows.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the empty rows found by the macro.
  8. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #7 above.

Macro Example

The following macro deletes all blank rows between rows number myFirstRow and LastRow.

  • myFirstRow is set to 6.
  • myLastRow is set to the number of the last row with data in the worksheet named “Delete empty rows”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
Sub deleteEmptyRows()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myWorksheet As Worksheet
    Dim iCounter As Long
    Dim myBlankRows As Range

    myFirstRow = 6

    Set myWorksheet = Worksheets("Delete empty rows")

    With myWorksheet
        myLastRow = .Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        For iCounter = myLastRow To myFirstRow Step -1
            If WorksheetFunction.CountA(.Rows(iCounter)) = 0 Then
                If Not myBlankRows Is Nothing Then
                    Set myBlankRows = Union(myBlankRows, .Rows(iCounter))
                Else
                    Set myBlankRows = .Rows(iCounter)
                End If
            End If
        Next iCounter
    End With

    If Not myBlankRows Is Nothing Then myBlankRows.Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes all blank rows between row 6 and the last row with data on the worksheet.

Macro deletes blank rows

#7: Delete Rows with Blank Cells

VBA Code to Delete Rows with Blank Cells

To delete rows with blank cells using VBA, use a macro with the following statement structure:

With Worksheet
    Set RangeForCriteria = .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))
End With
On Error Resume Next
RangeForCriteria.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Process Followed by VBA Code

Identify cell range > Identify empty cells > Return entire rows > Delete rows

VBA Statement Explanation

Lines #1 and #3: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: The statement within the With… End With statement (line #2 below) is executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Line #2: Set RangeForCriteria = .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))

  1. Item: Set… =.
    • VBA Construct: Set statement.
    • Description: Assigns the object reference returned by items #3 through #5 below to RangeForCriteria (item #2 below).
  2. Item: RangeForCriteria.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cell range you want the macro to search for blank cells.
  3. Item: .Range.
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell range specified as follows:
      • Upper-left corner cell: Range object returned by item #4 below.
      • Lower-right corner cell: Range object returned by item #5 below.
  4. Item: .Cells(FirstRow, FirstColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number FirstRow and column number FirstColumn.

      FirstRow and FirstColumn are the number of, respectively, the first row and first column in the cell range you want the macro to search for blank cells. If you explicitly declare a variable to represent FirstRow or FirstColumn, use the Long data type.

  5. Item: .Cells(LastRow, LastColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number LastRow and column number LastColumn.

      LastRow and LastColumn are the number of, respectively, the last row and last column in the cell range you want the macro to search for blank cells. If you explicitly declare a variable to represent LastRow or LastColumn, use the Long data type.

Line #4: On Error Resume Next

  1. Item: On Error Resume Next.
    • VBA Construct: On Error Resume Next statement.
    • Description: Specifies that, when a run-time error occurs, control goes to the statement following the statement where the error occurs.

      The error-handler in this line #4 is necessary because, if the cell range you want the macro to search for blank cells doesn’t contain any such cells, line #5 below generates a run-time error.

Line #5: RangeForCriteria.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

  1. Item: RangeForCriteria.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cell range you want the macro to search for blank cells.
  2. Item: SpecialCells(xlCellTypeBlanks).
    • VBA Construct: Range.SpecialCells method and Type parameter of Range.SpecialCells method.
    • Description: Returns a Range object representing all empty cells within the cell range returned by RangeForCriteria (item #1 above).
  3. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire rows containing the Range object returned by item #2 above.
  4. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #3 above.

Macro Example

The following macro deletes all rows with blank cells between:

  • Rows number myFirstRow and myLastRow.
  • Columns number myFirstColumn and myLastColumn.

In this example:

  • myFirstRow is set to 6.
  • myFirstColumn is set to 2.
  • myLastRow is set to the number of the last row with data in the worksheet named “Delete row with blank cells”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
  • myLastColumn is set to the number of the last column with data in the same worksheet. The constructs used by the statement that finds the last column with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Column property.
Sub deleteRowBlankCells()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myFirstColumn As Long
    Dim myLastColumn As Long
    Dim myWorksheet As Worksheet
    Dim myRange As Range

    myFirstRow = 6
    myFirstColumn = 2

    Set myWorksheet = Worksheets("Delete row with blank cells")

    With myWorksheet
        With .Cells
            myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            myLastColumn = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        End With
        Set myRange = .Range(.Cells(myFirstRow, myFirstColumn), .Cells(myLastRow, myLastColumn))
    End With

    On Error Resume Next
    myRange.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes all rows with blank cells between (i) row 6 and the last row with data on the worksheet, and (ii) column 2 and the last column with data on the worksheet.

Macro deletes rows with blank cells

#8: Delete Rows with Blank Cells in a Specific Column

VBA Code to Delete Rows with Blank Cells in a Specific Column

To delete rows with blank cells in a specific column using VBA, use a macro with the following statement structure:

With Worksheet
    With .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))
        .AutoFilter Field:=CriteriaField, Criteria1:="="
        On Error Resume Next
        .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count - 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    .AutoFilterMode = False
End With

Process Followed by VBA Code

Identify cell range > Filter to find blank cells > Exclude headers > Identify visible cells > Return entire rows > Delete rows

VBA Statement Explanation

Lines #1 and #8: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines #2 through #7 below) are executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Lines #2 and #6: With .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn)) | End With

  1. Item: With… End With.
    1. VBA Construct: With… End With statement.
    2. Description: Statements within the With… End With statement (lines #3 through #6 below) are executed on the range object returned by items #2 through #4 below.
  2. Item: .Range.
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell range specified as follows:
      • Upper-left corner cell: Range object returned by item #3 below.
      • Lower-right corner cell: Range object returned by item #4 below.
  3. Item: .Cells(FirstRow, FirstColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number FirstRow and column number FirstColumn.

      FirstRow and FirstColumn are the number of, respectively, the first row and first column in the cell range you work with. If you explicitly declare a variable to represent FirstRow or FirstColumn, use the Long data type.

  4. Item: .Cells(LastRow, LastColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number LastRow and column number LastColumn.

      LastRow and LastColumn are the number of, respectively, the last row and last column in the cell range you work with. If you explicitly declare a variable to represent LastRow or LastColumn, use the Long data type.

Line #3: .AutoFilter Field:=CriteriaField, Criteria1:=”=”

  1. Item: .AutoFilter.
    • VBA Construct: Range.AutoFilter method.
    • Description: Filter the data within the range you work with using the AutoFilter and according to the parameters specified by items #2 and #3 below.
  2. Item: Field:=CriteriaField.
    • VBA Construct: Field parameter of Range.AutoFilter method.
    • Description: Specifies the field on which you want to base the filter. The leftmost field of the range you work with is Field 1. The rightmost field is the number of fields in the cell range you work with.

      If you explicitly declare a variable to represent CriteriaField, use the Long data type.

  3. Item: Criteria1:=”=”.
    • VBA Construct: Criteria1 parameter of Range.AutoFilter method.
    • Description: Specifies the filtering criteria. “=” finds blank cells.

Line #4: On Error Resume Next

  1. Item: On Error Resume Next.
    • VBA Construct: On Error Resume Next statement.
    • Description: Specifies that, when a run-time error occurs, control goes to the statement following the statement where the error occurs.

      The error-handler in this line #4 is necessary because, if the field you filter by (line #3 above) doesn’t contain blank cells, line #5 below generates a run-time error.

Line #5: .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count – 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete

  1. Item: Offset.
    • VBA Construct: Range.Offset property.
    • Description: Returns a Range object a number of rows above or below the cell range it works with, as returned by line #2 above.
  2. Item: RowOffset:=1.
    • VBA Construct: RowOffset parameter of Range.Offset property.
    • Description: Specifies that the cell range returned by Range.Offset (item #1 above) is 1 row below the range specified in line #2 above.

      Line #2 above specifies the cell range you work with. Therefore, the Range object that Range.Offset returns has the same size but is 1 row below the cell range you work with. This results in the following:

      • The headers of the cell range you work with are excluded from the Range object.
      • The first empty row below the last row with data (LastRow in line #2 above) is included. This extra line is handled by item #7 below.
  3. Item: Resize.
    • VBA Construct: Range.Resize property.
    • Description: Resizes the cell range returned by items #1 and #2 above.
  4. Item: RowSize.
    • VBA Construct: RowSize parameter of Range.Resize property.
    • Description: Specifies the number of rows in the new cell range returned by Range.Resize (item #3 above).
  5. Item: Rows.
    • VBA Construct: Range.Rows property.
    • Description: Returns a Range object representing the rows in the cell range it works with, as returned by line #2 above.
  6. Item: Count.
    • VBA Construct: Range.Count property.
    • Description: Returns the number of rows within the Range object returned by item #5 above.
  7. Item: Resize(RowSize:=(.Rows.Count – 1)).
    • VBA Construct: Range.Resize property.
    • Description: Resizes the cell range returned by items #1 and #2 above to reduce it by one row. The number of rows in the new range is obtained by subtracting 1 from the number of rows returned by line #2, as counted by items #5 and #6 above.

      This results in a cell range that excludes the first empty row below the last row with data that the Range.Offset property (items #1 and #2 above) included.

  8. Item: SpecialCells(xlCellTypeVisible).
    • VBA Construct: Range.SpecialCells method and Type parameter of Range.SpecialCells method.
    • Description: Returns a Range object representing all visible cells within the cell range you work with, excluding the headers (as required by item #2 above).

      Since line #3 above filters the data according to the criteria you specify, the visible cells returned by Range.SpecialCells are those containing blank cells in the column (field) you specify.

  9. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire rows containing the Range object returned by item #8 above.
  10. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #10 above.

Line #7: .AutoFilterMode = False

  1. Item: .AutoFilterMode = False.
    • VBA Construct: Worksheet.AutoFilterMode property.
    • Description: Specifies that the AutoFilter drop-down arrows aren’t displayed on the worksheet.

Macro Example

The following macro deletes all rows that meet the following conditions:

  • Are between:
    • Rows number (myFirstRow + 1) and myLastrow.
    • Columns number myFirstColumn and myLastColumn.
  • Contain a blank cell in field number myCriteriaField.

In this example:

  • myFirstRow is set to 5.
  • myFirstColumn is set to 2.
  • myCriteriaField is set to 1.
  • myLastRow is set to the number of the last row with data in the worksheet named “Delete row if cell is blank”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
  • myLastColumn is set to the number of the last column with data in the same worksheet. The constructs used by the statement that finds the last column with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Column property.
Sub deleteRowBlankCell()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myFirstColumn As Long
    Dim myLastColumn As Long
    Dim myCriteriaField As Long
    Dim myWorksheet As Worksheet

    myFirstRow = 5
    myFirstColumn = 2
    myCriteriaField = 1

    Set myWorksheet = Worksheets("Delete row if cell is blank")

    With myWorksheet
        With .Cells
            myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            myLastColumn = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        End With
        With .Range(.Cells(myFirstRow, myFirstColumn), .Cells(myLastRow, myLastColumn))
            .AutoFilter Field:=myCriteriaField, Criteria1:="="
            On Error Resume Next
            .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count - 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes the rows containing blank cells in myCriteriaField (1).

Macro deletes rows with blank cells in first column

#9: Delete Rows Containing Strings

VBA Code to Delete Rows Containing Strings

To delete rows containing strings using VBA, use a macro with the following statement structure:

With Worksheet
    Set RangeForCriteria = .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))
End With
On Error Resume Next
RangeForCriteria.SpecialCells(xlCellTypeConstants, xlTextValues).EntireRow.Delete

Process Followed by VBA Code

Identify cell range > Identify cells with strings > Return entire rows > Delete rows

VBA Statement Explanation

Lines #1 and #3: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: The statement within the With… End With statement (line #2 below) is executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Line #2: Set RangeForCriteria = .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))

  1. Item: Set… =.
    • VBA Construct: Set statement.
    • Description: Assigns the object reference returned by items #3 through #5 below to RangeForCriteria (item #2 below).
  2. Item: RangeForCriteria.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cell range you want the macro to search for cells containing strings.
  3. Item: .Range.
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell range specified as follows:
      • Upper-left corner cell: Range object returned by item #4 below.
      • Lower-right corner cell: Range object returned by item #5 below.
  4. Item: .Cells(FirstRow, FirstColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number FirstRow and column number FirstColumn.

      FirstRow and FirstColumn are the number of, respectively, the first row and first column in the cell range you want the macro to search for cells containing strings. If you explicitly declare a variable to represent FirstRow or FirstColumn, use the Long data type.

  5. Item: .Cells(LastRow, LastColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number LastRow and column number LastColumn.

      LastRow and LastColumn are the number of, respectively, the last row and last column in the cell range you want the macro to search for cells containing strings. If you explicitly declare a variable to represent LastRow or LastColumn, use the Long data type.

Line #4: On Error Resume Next

  1. Item: On Error Resume Next.
    • VBA Construct: On Error Resume Next statement.
    • Description: Specifies that, when a run-time error occurs, control goes to the statement following the statement where the error occurs.
      The error-handler in this line #4 is necessary because, if the cell range you want the macro to search for cells containing strings doesn’t contain any such cells, line #5 below generates a run-time error.

Line #5: RangeForCriteria.SpecialCells(xlCellTypeConstants, xlTextValues).EntireRow.Delete

  1. Item: RangeForCriteria.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cell range you want the macro to search for cells containing strings.
  2. Item: SpecialCells(xlCellTypeConstants, xlTextValues).
    • VBA Construct: Range.SpecialCells method, Type and Value parameters of Range.SpecialCells method.
    • Description: Returns a Range object representing all cells containing constant (xlCellTypeConstants) text values (xlTextValues) within the cell range returned by RangeForCriteria (item #1 above). Those are the cells containing strings.
  3. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire rows containing the Range object returned by item #2 above.
  4. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #3 above.

Macro Example

The following macro deletes all rows containing strings between:

  1. Rows number myFirstRow and myLastRow.
  2. Columns number myFirstColumn and myLastColumn.

In this example:

  • myFirstRow is set to 6.
  • myFirstColumn is set to 2.
  • myLastRow is set to the number of the last row with data in the worksheet named “Delete rows containing strings”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
  • myLastColumn is set to the number of the last column with data in the same worksheet. The constructs used by the statement that finds the last column with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Column property.
Sub deleteRowContainingStrings()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myFirstColumn As Long
    Dim myLastColumn As Long
    Dim myWorksheet As Worksheet
    Dim myRange As Range

    myFirstRow = 6
    myFirstColumn = 2

    Set myWorksheet = Worksheets("Delete rows containing strings")

    With myWorksheet
        With .Cells
            myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            myLastColumn = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        End With
        Set myRange = .Range(.Cells(myFirstRow, myFirstColumn), .Cells(myLastRow, myLastColumn))
    End With

    On Error Resume Next
    myRange.SpecialCells(xlCellTypeConstants, xlTextValues).EntireRow.Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes all rows containing strings between (i) row 6 and the last row with data on the worksheet, and (ii) column 2 and the last column with data on the worksheet.

Macro deletes rows containing strings

#10: Delete Row Based on Cell Value

VBA Code to Delete Row Based on Cell Value

To delete rows based on the value in a specific cell using VBA, use a macro with the following statement structure:

With Worksheet
    With .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))
        .AutoFilter Field:=CriteriaField, Criteria1:=Value
        On Error Resume Next
        .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count - 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    .AutoFilterMode = False
End With

Process Followed by VBA Code

Identify cell range > Filter cells with value > Exclude headers > Identify visible cells > Return entire rows > Delete rows

VBA Statement Explanation

Lines #1 and #8: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines #2 through #7 below) are executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Lines #2 and #6: With .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn)) | End With

  1. Item: With… End With.
    1. VBA Construct: With… End With statement.
    2. Description: Statements within the With… End With statement (lines #3 through #6 below) are executed on the range object returned by items #2 through #4 below.
  2. Item: .Range.
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell range specified as follows:
      • Upper-left corner cell: Range object returned by item #3 below.
      • Lower-right corner cell: Range object returned by item #4 below.
  3. Item: .Cells(FirstRow, FirstColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number FirstRow and column number FirstColumn.

      FirstRow and FirstColumn are the number of, respectively, the first row and first column in the cell range you work with. If you explicitly declare a variable to represent FirstRow or FirstColumn, use the Long data type.

  4. Item: .Cells(LastRow, LastColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number LastRow and column number LastColumn.

      LastRow and LastColumn are the number of, respectively, the last row and last column in the cell range you work with. If you explicitly declare a variable to represent LastRow or LastColumn, use the Long data type.

Line #3: .AutoFilter Field:=CriteriaField, Criteria1:=Value

  1. Item: .AutoFilter.
    • VBA Construct: Range.AutoFilter method.
    • Description: Filter the data within the range you work with using the AutoFilter and according to the parameters specified by items #2 and #3 below.
  2. Item: Field:=CriteriaField.
    • VBA Construct: Field parameter of Range.AutoFilter method.
    • Description: Specifies the field on which you want to base the filter. The leftmost field of the range you work with is Field 1. The rightmost field is the number of fields in the cell range you work with.

      If you explicitly declare a variable to represent CriteriaField, use the Long data type.

  3. Item: Criteria1:=Value.
    • VBA Construct: Criteria1 parameter of Range.AutoFilter method.
    • Description: Specifies the filtering criteria. If you explicitly declare a variable to represent Value, ensure that the data type you use can handle the value you use as criteria.

Line #4: On Error Resume Next

  1. Item: On Error Resume Next.
    • VBA Construct: On Error Resume Next statement.
    • Description: Specifies that, when a run-time error occurs, control goes to the statement following the statement where the error occurs.

      The error-handler in this line #4 is necessary because, if the field you filter by (line #3 above) doesn’t contain cells with the value you use as criteria, line #5 below generates a run-time error.

Line #5: .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count – 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete

  1. Item: Offset.
    • VBA Construct: Range.Offset property.
    • Description: Returns a Range object a number of rows above or below the cell range it works with, as returned by line #2 above.
  2. Item: RowOffset:=1.
    • VBA Construct: RowOffset parameter of Range.Offset property.
    • Description: Specifies that the cell range returned by Range.Offset (item #1 above) is 1 row below the range specified in line #2 above.

      Line #2 above specifies the cell range you work with. Therefore, the Range object that Range.Offset returns has the same size but is 1 row below the cell range you work with. This results in the following:

      • The headers of the cell range you work with are excluded from the Range object.
      • The first empty row below the last row with data (LastRow in line #2 above) is included. This extra line is handled by item #7 below.
  3. Item: Resize.
    • VBA Construct: Range.Resize property.
    • Description: Resizes the cell range returned by items #1 and #2 above.
  4. Item: RowSize.
    • VBA Construct: RowSize parameter of Range.Resize property.
    • Description: Specifies the number of rows in the new cell range returned by Range.Resize (item #3 above).
  5. Item: Rows.
    • VBA Construct: Range.Rows property.
    • Description: Returns a Range object representing the rows in the cell range it works with, as returned by line #2 above.
  6. Item: Count.
    • VBA Construct: Range.Count property.
    • Description: Returns the number of rows within the Range object returned by item #5 above.
  7. Item: Resize(RowSize:=(.Rows.Count – 1)).
    1. VBA Construct: Range.Resize property.
    2. Description: Resizes the cell range returned by items #1 and #2 above to reduce it by one row. The number of rows in the new range is obtained by subtracting 1 from the number of rows returned by line #2, as counted by items #5 and #6 above.

      This results in a cell range that excludes the first empty row below the last row with data that the Range.Offset property (items #1 and #2 above) included.

  8. Item: SpecialCells(xlCellTypeVisible).
    • VBA Construct: Range.SpecialCells method and Type parameter of Range.SpecialCells method.
    • Description: Returns a Range object representing all visible cells within the cell range you work with, excluding the headers (as required by item #2 above).

      Since line #3 above filters the data according to the criteria you specify, the visible cells returned by Range.SpecialCells are those containing the value you’re looking for in the column (field) you specify.

  9. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire rows containing the Range object returned by item #8 above.
  10. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #10 above.

Line #7: .AutoFilterMode = False

  1. Item: .AutoFilterMode = False.
    • VBA Construct: Worksheet.AutoFilterMode property.
    • Description: Specifies that the AutoFilter drop-down arrows aren’t displayed on the worksheet.

Macro Example

The following macro deletes all rows that meet the following conditions:

  • Are between:
    • Rows number (myFirstRow + 1) and myLastRow.
    • Columns number myFirstColumn and myLastColumn.
  • Contain the value myValue in field number myCriteriaField.

In this example:

  • myFirstRow is set to 5.
  • myFirstColumn is set to 2.
  • myCriteriaField is set to 1.
  • myValue is set to 5.
  • myLastRow is set to the number of the last row with data in the worksheet named “Delete row based on value”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
  • myLastColumn is set to the number of the last column with data in the same worksheet. The constructs used by the statement that finds the last column with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Column property.
Sub deleteRowBasedOnValue()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myFirstColumn As Long
    Dim myLastColumn As Long
    Dim myCriteriaField As Long
    Dim myValue As Double
    Dim myWorksheet As Worksheet

    myFirstRow = 5
    myFirstColumn = 2
    myCriteriaField = 1
    myValue = 5

    Set myWorksheet = Worksheets("Delete row based on value")

    With myWorksheet
        With .Cells
            myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            myLastColumn = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        End With
        With .Range(.Cells(myFirstRow, myFirstColumn), .Cells(myLastRow, myLastColumn))
            .AutoFilter Field:=myCriteriaField, Criteria1:=myValue
            On Error Resume Next
            .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count - 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes the rows containing myValue (5) in myCriteriaField (1).

Macro deletes rows based on value

#11: Delete Row Based on Date

VBA Code to Delete Row Based on Date

To delete rows based on the date in a specific cell using VBA, use a macro with the following statement structure:

With Worksheet
    For Counter = LastRow To FirstRow Step -1
        With .Cells(Counter, CriteriaColumn)
            If .Value = Date Then
                If Not RowsWithDate Is Nothing Then
                    Set RowsWithDate = Union(RowsWithDate, .Cells)
                Else
                    Set RowsWithDate = .Cells
                End If
            End If
        End With
    Next Counter
End With
If Not RowsWithDate Is Nothing Then RowsWithDate.EntireRow.Delete

Process Followed by VBA Code

Loop through all rows > Does row contain date? > Add cell with date to object variable representing cells with date > Return entire rows > Delete rows

VBA Statement Explanation

Lines #1 and #13: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines #2 through #12 below) are executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Lines #2 and #12: For Counter = LastRow To FirstRow Step -1 | Next Counter

  1. Item: For… Next Counter.
    • VBA Construct: For… Next statement.
    • Description: Repeats the statements within the loop (lines #3 through #11 below) for each row between (and including FirstRow (item #4 below) and LastRow (item #3 below).
  2. Item: Counter.
    • VBA Construct: Counter of For… Next statement.
    • Description: Loop counter. If you explicitly declare a variable to represent the loop counter, use the Long data type.
  3. Item: LastRow.
    • VBA Construct: Counter Start of For… Next statement.
    • Description: Number of the last row (further down the worksheet) you want the macro to consider when identifying blank rows. The number of the last row is also the initial value of Counter (item #2 above).

      If you explicitly declare a variable to represent the number of the last row to consider, use the Long data type.

  4. Item: FirstRow.
    • VBA Construct: Counter End of For… Next statement.
    • Description: Number of the first row (closer to the top of the worksheet) you want the macro to consider when identifying blank rows. The number of the first row is also the final value of Counter (item (#2 above).

      If you explicitly declare a variable to represent the number of the first row to consider, use the Long data type.

  5. Item: Step -1.
    • VBA Construct: Step of For… Next statement.
    • Description: Amount by which Counter (item #2 above) changes every time a loop iteration occurs.

      In this scenario, you loop backwards: from LastRow (item #3 above) to FirstRow (item #4 above). Therefore, step is -1.

Lines #3 and #11: With .Cells(Counter, CriteriaColumn) | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines #4 through #10 below) are executed on the cell returned by item #2 below.
  2. Item: .Cells(Counter, CriteriaColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number Counter and column number CriteriaColumn.

      At any given time, the value of the loop counter (Counter) is the same as that of the row through which the macro is currently looping. CriteriaColumn is the number of the column containing the cells with dates you consider.

Line #4: If .Value = Date Then

  1. Item: If… Then.
    • VBA Construct: Opening line of If… Then… Else statement.
    • Description: Conditionally executes the statements within the If… Then block (lines #5 through #9 below) if the condition specified by item #3 below is met.
  2. Item: .Value.
    • VBA Construct: Range.Value property.
    • Description: Returns the value of the cell represented by the Range object returned by line #3 above (.Cells(Counter, CriteriaColumn)). This is the value of the cell at the intersection of the row through which the macro is currently looping and the column containing the cells with dates you consider.
  3. Item: .Value = Date.
    • VBA Construct: Condition of If… Then… Else statement.
    • Description: This condition is a numeric expression that evaluates to True or False, as follows:
      • True: When the value of the cell at the intersection of the row through which the macro is currently looping and the column containing the cells with dates you consider is equal to the date you specify (Date).
      • False: When the value of the cell at the intersection of the row through which the macro is currently looping and the column containing the cells with dates you consider isn’t equal to the date you specify (Date).

      If you explicitly declare a variable to represent Date, ensure that the data type you use can handle the value you use as criteria. Consider, for example, using the Date data type.

      When specifying the date you use as criteria, ensure that you specify the date as a value as required by VBA. For these purposes, you can use VBA constructs such as the DateValue or DateSerial Functions.

Line #5: If Not RowsWithDate Is Nothing Then

  1. Item: If… Then.
    • VBA Construct: Opening line of If… Then… Else statement.
    • Description: Conditionally executes the statement within the If… Then… Else block (line #6 below) if the condition specified by item #6 below is met.
  2. Item: Not.
    • VBA Construct: Not operator.
    • Description: Carries out a logical negation on item #3 below. In other words, if item #3 returns:
      • True, the result is False.
      • False, the result is True.
  3. Item: RowsWithDate.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cells in the column you specify (CriteriaColumn in line #3 above) containing the date you use as criteria.
  4. Item: Is.
    • VBA Construct: Is Operator.
    • Description: Compares 2 object reference variables: (i) Not RowsWithDate (items #2 and #3 above) vs. (ii) Nothing (item #5 below).

      If both object references refer to the same object, the Is operator returns True. If they refer to different objects, Is returns False.

  5. Item: Nothing.
    • Description: The default value for a data type. In the case of an object variable (such as RowsWithDate), a null reference.
  6. Item: Not RowsWithDate Is Nothing.
    • VBA Construct: Condition of If… Then… Else statement.
    • Description: The condition is an expression that evaluates to True or False, as follows:
      • True: When “Not RowsWithDate” (items #2 and #3 above) refers to the same object as Nothing (item #5 above). This happens when RowsWithDate is “something”.

        Since RowsWithDate holds a Range object representing the cells with the criteria date found by the macro in a specific column (CriteriaColumn in line #3 above), RowsWithDate is something after the macro finds the first such cell.

      • False: When “Not RowsWithDate” refers to a different object from Nothing. This happens when RowsWithDate itself is Nothing. This occurs prior to the macro finding the first cell with the criteria date. This is because RowsWithDate isn’t assigned to anything prior to that moment.

Line #6: Set RowsWithDate = Union(RowsWithDate, .Cells)

  1. Item: Set… =.
    • VBA Construct: Set statement.
    • Description: Assigns the object reference returned by item #6 below to RowsWithDate (item #2 below).
  2. Item: RowsWithDate.
    • VBA Construct: Object (Range) variable of Set statement.
    • Description:
      • Holds a Range object representing the cells in the column you specify (CriteriaColumn in line #3 above) containing the date you use as criteria.
      • RowsWithDate is included twice in the statement. In the first mention (Set RowsWithDate), RowsWithDate is the object variable to which an object reference is assigned.
  3. Item: Union.
    • VBA Construct: Application.Union method.
    • Description: Returns a Range object representing the union of the Range objects returned by items #4 and #5 below.
  4. Item: RowsWithDate.
    • VBA Construct: Object (Range) variable.
    • Description:
      • Holds a Range object representing the cells in the column you specify (CriteriaColumn in line #3 above) containing the date you use as criteria.
      • RowsWithDate is included twice in the statement. In the second mention (Union(RowsWithDate, .Cells), RowsWithDate is one of the parameters of the Application.Union method.
  5. Item: .Cells.
    • VBA Construct: Range.Cells property.
    • Description: Returns a Range object representing the cell represented by the Range object returned by line #3 above (.Cells(Counter, CriteriaColumn)). This is the cell at the intersection of the row through which the macro is currently looping and the column containing the cells with dates you consider.
  6. Item: Union(RowsWithDate, .Cells).
    • VBA Construct: Object expression of Set statement.
    • Description: Returns the new Range object reference assigned to the RowsWithDate object variable (item #2 above). This is the union of the following 2 Range objects:
      • Prior to the Set statement, RowsWithDate represents cells in the column you specify containing the date you use as criteria found by the macro prior to the row through which it’s currently looping.
      • “.Cells” represents the cell at the intersection of the row through which the macro is currently looping and the column containing the cells with dates you consider.

      Graphically, this looks as follows:

      Union(RowsWithDate, .Cells)

      In other words, any cell containing the criteria date the macro finds is “added” to RowsWithDate.

Line #7: Else

  1. Item: Else.
    • VBA Construct: Else clause of If… Then… Else statement.
    • Description: The statement following the Else clause (line #8 below) is executed if the condition tested in the opening line of the If… Then… Else statement (line #5 above) isn’t met and returns False.

Line #8: Set RowsWithDate = .Cells

  1. Item: Set… =.
    • VBA Construct: Set statement.
    • Description: Assigns the object reference returned by item #3 below to RowsWithDate (item #2 below).
  2. Item: RowsWithDate.
    • VBA Construct: Object (Range) variable of Set statement.
    • Description: Holds a Range object representing the cells in the column you specify (CriteriaColumn in line #3 above) containing the date you use as criteria.
  3. Item: .Cells.
    • VBA Construct: Range.Cells property.
    • Description: Returns a Range object representing the cell represented by the Range object returned by line #3 above (.Cells(Counter, CriteriaColumn)). This is the cell at the intersection of the row through which the macro is currently looping and the column containing the cells with dates you consider.

Lines #9 and #10: End If | End If

  1. Item: End If.
    • VBA Construct: Closing lines of If… Then… Else statements.
    • Description: Ends the If… Then… Else statements that began in lines #4 and #5 above.

Line #14: If Not RowsWithDate Is Nothing Then RowsWithDate.EntireRow.Delete

  1. Item: If… Then.
    • VBA Construct: If… Then… Else statement.
    • Description: Conditionally executes the statement within at the end of the line (items #7 through #9 below) if the condition specified by item #6 below is met.
  2. Item: Not.
    • VBA Construct: Not operator.
    • Description: Carries out a logical negation on item #3 below. In other words, if item #3 returns:
      • True, the result is False.
      • False, the result is True.
  3. Item: RowsWithDate.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cells in the column you specify (CriteriaColumn in line #3 above) containing the date you use as criteria.
  4. Item: Is.
    • VBA Construct: Is Operator.
    • Description: Compares 2 object reference variables: (i) Not RowsWithDate (items #2 and #3 above) vs. (ii) Nothing (item #5 below).

      If both object references refer to the same object, the Is operator returns True. If they refer to different objects, Is returns False.

  5. Item: Nothing.
    • Description: The default value for a data type. In the case of an object variable (such as RowsWithDate), a null reference.
  6. Item: Not RowsWithDate Is Nothing.
    • VBA Construct: Condition of If… Then… Else statement.
    • Description: The condition is an expression that evaluates to True or False, as follows:
      • True: When “Not RowsWithDate” (items #2 and #3 above) refers to the same object as Nothing (item #5 above). This happens when RowsWithDate is “something”.

        Since RowsWithDate holds a Range object representing the cells with the criteria date found by the macro in a specific column (CriteriaColumn in line #3 above), RowsWithDate is something if the macro finds at least one such cell.

      • False: When “Not RowsWithDate” refers to a different object from Nothing. This happens when RowsWithDate itself is Nothing. This, in turn, occurs when the macro founds no cells with the criteria date within the specified column.
  7. Item: RowsWithDate.
    • VBA Construct: Object (Range) variable.
    • Description: Holds a Range object representing the cells in the column you specify (CriteriaColumn in line #3 above) containing the date you use as criteria.
  8. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire row containing the cell range returned by item #7 above.
  9. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #8 above.

Macro Example

The following macro deletes all rows that meet the following conditions:

  • Are between rows number myFirstRow and myLastRow.
  • Contain the date myDate in column number myCriteriaColumn.

In this example:

  • myFirstRow is set to 5.
  • myDate is set to the serial number representing June 15, 2017. For purposes of obtaining the appropriate serial number, I use the DateValue Function.
  • myCriteriaColumn is set to 2.
  • myLastRow is set to the number of the last row with data in the worksheet named “Delete row based on date”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
Sub deleteRowBasedOnDate()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myCriteriaColumn As Long
    Dim myDate As Date
    Dim myWorksheet As Worksheet
    Dim iCounter As Long
    Dim myRowsWithDate As Range

    myFirstRow = 6
    myCriteriaColumn = 2
    myDate = DateValue("June 15, 2017")

    Set myWorksheet = Worksheets("Delete row based on date")

    With myWorksheet
        myLastRow = .Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        For iCounter = myLastRow To myFirstRow Step -1
            With .Cells(iCounter, myCriteriaColumn)
                If .Value = myDate Then
                    If Not myRowsWithDate Is Nothing Then
                        Set myRowsWithDate = Union(myRowsWithDate, .Cells)
                    Else
                        Set myRowsWithDate = .Cells
                    End If
                End If
            End With
        Next iCounter
    End With

    If Not myRowsWithDate Is Nothing Then myRowsWithDate.EntireRow.Delete

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes the rows containing myDate (June 15, 2017) in myCriteriaColumn (2).

Macro deletes rows based on date

#12: Delete Row Based on String Criteria

VBA Code to Delete Row Based on String Criteria

To delete rows based on the string in a specific cell using VBA, use a macro with the following statement structure:

With Worksheet
    With .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))
        .AutoFilter Field:=CriteriaField, Criteria1:=String
        On Error Resume Next
        .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count - 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    .AutoFilterMode = False
End With

Process Followed by VBA Code

Identify cell range > Filter cells with string > Exclude headers > Identify visible cells > Return entire rows > Delete rows

VBA Statement Explanation

Lines #1 and #8: With Worksheet | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines #2 through #7 below) are executed on the worksheet returned by item #2 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.

Lines #2 and #6: With .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn)) | End With

  1. Item: With… End With.
    1. VBA Construct: With… End With statement.
    2. Description: Statements within the With… End With statement (lines #3 through #6 below) are executed on the range object returned by items #2 through #4 below.
  2. Item: .Range.
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell range specified as follows:
      • Upper-left corner cell: Range object returned by item #3 below.
      • Lower-right corner cell: Range object returned by item #4 below.
  3. Item: .Cells(FirstRow, FirstColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number FirstRow and column number FirstColumn.

      FirstRow and FirstColumn are the number of, respectively, the first row and first column in the cell range you work with. If you explicitly declare a variable to represent FirstRow or FirstColumn, use the Long data type.

  4. Item: .Cells(LastRow, LastColumn).
    • VBA Construct: Worksheet.Cells property and Range.Item property.
    • Description: Returns a Range object representing the cell at the intersection of row number LastRow and column number LastColumn.

      LastRow and LastColumn are the number of, respectively, the last row and last column in the cell range you work with. If you explicitly declare a variable to represent LastRow or LastColumn, use the Long data type.

Line #3: .AutoFilter Field:=CriteriaField, Criteria1:=String

  1. Item: .AutoFilter.
    • VBA Construct: Range.AutoFilter method.
    • Description: Filter the data within the range you work with using the AutoFilter and according to the parameters specified by items #2 and #3 below.
  2. Item: Field:=CriteriaField.
    • VBA Construct: Field parameter of Range.AutoFilter method.
    • Description: Specifies the field on which you want to base the filter. The leftmost field of the range you work with is Field 1. The rightmost field is the number of fields in the cell range you work with.

      If you explicitly declare a variable to represent CriteriaField, use the Long data type.

  3. Item: Criteria1:=String.
    • VBA Construct: Criteria1 parameter of Range.AutoFilter method.
    • Description: Specifies the filtering criteria. If you explicitly declare a variable to represent String, use the String data type.

Line #4: On Error Resume Next

  1. Item: On Error Resume Next.
    • VBA Construct: On Error Resume Next statement.
    • Description: Specifies that, when a run-time error occurs, control goes to the statement following the statement where the error occurs.

      The error-handler in this line #4 is necessary because, if the field you filter by (line #3 above) doesn’t contain cells with the string you use as criteria, line #5 below generates a run-time error.

Line #5: .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count – 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete

  1. Item: Offset.
    • VBA Construct: Range.Offset property.
    • Description: Returns a Range object a number of rows above or below the cell range it works with, as returned by line #2 above.
  2. Item: RowOffset:=1.
    • VBA Construct: RowOffset parameter of Range.Offset property.
    • Description: Specifies that the cell range returned by Range.Offset (item #1 above) is 1 row below the range specified in line #2 above.

      Line #2 above specifies the cell range you work with. Therefore, the Range object that Range.Offset returns has the same size but is 1 row below the cell range you work with. This results in the following:

      • The headers of the cell range you work with are excluded from the Range object.
      • The first empty row below the last row with data (LastRow in line #2 above) is included. This extra line is handled by item #7 below.
  3. Item: Resize.
    • VBA Construct: Range.Resize property.
    • Description: Resizes the cell range returned by items #1 and #2 above.
  4. Item: RowSize.
    • VBA Construct: RowSize parameter of Range.Resize property.
    • Description: Specifies the number of rows in the new cell range returned by Range.Resize (item #3 above).
  5. Item: Rows.
    • VBA Construct: Range.Rows property.
    • Description: Returns a Range object representing the rows in the cell range it works with, as returned by line #2 above.
  6. Item: Count.
    • VBA Construct: Range.Count property.
    • Description: Returns the number of rows within the Range object returned by item #5 above.
  7. Item: Resize(RowSize:=(.Rows.Count – 1)).
    1. VBA Construct: Range.Resize property.
    2. Description: Resizes the cell range returned by items #1 and #2 above to reduce it by one row. The number of rows in the new range is obtained by subtracting 1 from the number of rows returned by line #2, as counted by items #5 and #6 above.

      This results in a cell range that excludes the first empty row below the last row with data that the Range.Offset property (items #1 and #2 above) included.

  8. Item: SpecialCells(xlCellTypeVisible).
    • VBA Construct: Range.SpecialCells method and Type parameter of Range.SpecialCells method.
    • Description: Returns a Range object representing all visible cells within the cell range you work with, excluding the headers (as required by item #2 above).

      Since line #3 above filters the data according to the criteria you specify, the visible cells returned by Range.SpecialCells are those containing the string you’re looking for in the column (field) you specify.

  9. Item: EntireRow.
    • VBA Construct: Range.EntireRow property.
    • Description: Returns a Range object representing the entire rows containing the Range object returned by item #8 above.
  10. Item: Delete.
    • VBA Construct: Range.Delete method.
    • Description: Deletes the Range object returned by item #10 above.

Line #7: .AutoFilterMode = False

  1. Item: .AutoFilterMode = False.
    • VBA Construct: Worksheet.AutoFilterMode property.
    • Description: Specifies that the AutoFilter drop-down arrows aren’t displayed on the worksheet.

Macro Example

The following macro deletes all rows that meet the following conditions:

  • Are between:
    • Rows number (myFirstRow + 1) and myLastRow.
    • Columns number myFirstColumn and myLastColumn.
  • Contain the string myString in field number myCriteriaField.

In this example:

  • myFirstRow is set to 5.
  • myFirstColumn is set to 2.
  • myCriteriaField is set to 1.
  • myString is set to “*to delete*”.

    The asterisks at the beginning and end of the string act as wildcards representing any number of characters. Therefore, myString includes any strings that contain “to delete”, regardless of the text before or after it.

    For example, in the example below, I use this macro to delete rows where the cell in the first column contains the string “Rows to delete now”. “to delete” is between the strings “Rows ” and ” now”, both of which are covered by the asterisk wildcard.

  • myLastRow is set to the number of the last row with data in the worksheet named “Delete row based on string”. The constructs used by the statement that finds the last row with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Row property.
  • myLastColumn is set to the number of the last column with data in the same worksheet. The constructs used by the statement that finds the last column with data in the worksheet are the Worksheet.Cells property, the Range.Find method, and the Range.Column property.
Sub deleteRowBasedOnString()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-delete-row/

    Dim myFirstRow As Long
    Dim myLastRow As Long
    Dim myFirstColumn As Long
    Dim myLastColumn As Long
    Dim myCriteriaField As Long
    Dim myString As String
    Dim myWorksheet As Worksheet

    myFirstRow = 5
    myFirstColumn = 2
    myCriteriaField = 1
    myString = "*to delete*"

    Set myWorksheet = Worksheets("Delete row based on string")

    With myWorksheet
        With .Cells
            myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            myLastColumn = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        End With
        With .Range(.Cells(myFirstRow, myFirstColumn), .Cells(myLastRow, myLastColumn))
            .AutoFilter Field:=myCriteriaField, Criteria1:=myString
            On Error Resume Next
            .Offset(RowOffset:=1).Resize(RowSize:=(.Rows.Count - 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA deletes the rows containing myString (“*to delete*”) in myCriteriaField (1).

Macro deletes rows based on string criteria

References to VBA Constructs Used in this VBA Tutorial

Use the following links to visit the appropriate webpage within the Microsoft Office Dev Center:

  1. Identify the worksheet you work with:
    • Workbook.Worksheets property.
  2. Find last row and last column with data in a worksheet and count number of rows in a cell range:
    • Range.Find method.
    • Range.Count property.
  3. Return Range objects:
    • Application.ActiveCell property.
    • Worksheet.Cells property.
    • Range.Cells property.
    • Range.Offset property.
    • Range.Resize property.
    • Application.Union method.
  4. Return Range objects representing rows:
    • Worksheet.Rows property.
    • Range.Rows property.
    • Range.EntireRow property.
  5. Loop through rows:
    • For… Next statement.
  6. Specify criteria for row deletion:
    • DateSerial Function.
    • DateValue Function.
    • Range.Value property.
  7. Test if (i) rows meet criteria for deletion, or (ii) the macro has found rows or cells meeting the criteria for deletion:
    • If… Then… Else statement.
    • Range.AutoFilter method.
    • Range.SpecialCells method.
    • WorksheetFunction.CountA method.
    • Not operator.
    • Is operator.
  8. Delete rows.
    • Range.Delete method.
  9. Work with variables:
    • Dim statement.
    • Set statement.
    • Data types:
      • Data data type.
      • Double data type.
      • Long data type.
      • Object data type.
      • String data type.
      • Variant data type.
  10. Simplify object references:
    • With… End With statement.
  11. Handle errors:
    • On Error statement.
  12. Remove AutoFilter drop-down arrows:
    • Worksheet.AutoFilterMode property.

There could be times when we have to delete blank rows or columns from a file in Excel for loop we will write vba macro / code.  The code that we need to use will vary from situation to situation.  Sometimes we may have to delete one row or column while sometimes we need to delete an entire range of rows or columns or sometimes rows / columns based on one or more conditions.

If you have to delete just one or more specific rows or columns,we use VBA excel for loop and you can just use the following code —

Option Explicit
Sub macro1()
Application.DisplayAlerts=False
With Worksheets(“Sheet1”)
.Rows(“5:6”).Delete
.Columns(“A:D”).Delete
End With
Application.DisplayAlerts = True
End Sub

You can see the code which has been copied into the Module1 code window.  To copy the code, press Alt + F11 on your file.  On the left hand side you will see Microsoft Excel Objects.  Right click and select Insert, then click on Module.  The code window will appear on the right.  Copy the code over.  See the below picture —

img1

Application.DisplayAlerts = False

We set display alerts to false and save the file with the required file name.  And then set the display alerts to true just before the End Sub.

With Worksheets(“Sheet1”) is a With loop which ends with End With.  If you use this for loop VBA Excel, all statements inside this loop, which use this object, need not start with “Worksheets(“Sheet1”)”.  Instead, they can directly start with just a dot (.).

.Rows(“5:6”).Delete will delete rows 5 and 6 only.

.Columns(“A:D”).Delete will delete columns A to D.

Only the specified rows / columns will be deleted in this case.

However, sometimes you may have to delete rows / columns based on certain conditions.  For e.g. lets assume that we want to delete all columns in the file which contain “Test” as the header.   In this case, we need a loop which will check from one column to the other and when the criteria is met, it will delete the column.

We can use a code like this.  Note that each person will prepare the code in the manner he/she is comfortable with.  This is just one of the ways this can be coded and is not the only method.

Option Explicit
Sub macro2()
Dim i As Long, lcol As Long
Application.DisplayAlerts = False
With Worksheets(“Sheet1”)
lcol = .Range(“A1”).End(xlToRight).Column
For i = lcol to 1 Step -1
If .Cells(1,i).Value = “” Then Exit For
If .Cells(1,i).value = “Test” Then .Columns(i).Delete
Next i
End With
Application.DisplayAlerts = True
End Sub

See the code which has been saved in Module 1 as per the picture below

img2

Here lcol is the last column in the sheet which has data in it.  Incase you happen to test this code on a blank file, lcol will have the value of 16384 or the column number of the last column as per your version of excel.  Then we loop from the last column to the first column, moving one step backwards each time.  We are moving backwards because the delete code works fine only when you start deleting from the last row or last column.  If you start from the 1st row / column the code tends to error out.

The 1st if condition is input there incase you run the macro on a blank file.  In Excel macro will loop from the last column which is 16384 in this case till column 1 and this could take a fairly long time.  So incase the code finds a blank column, it will terminate the loop immediately through the exit For statement.  The 2ndif condition checks if the value is “Test” and deletes the column if “Test” is found.

In case you want to delete the rows instead of columns, the code will change to –

Option Explicit
Sub macro3()
Dim i As Long, lrow As Long
Application.DisplayAlerts = False
With Worksheets(“Sheet1”)
lrow = .range(“A” & .Rows.Count).End(xlUp).Row
For i = lrow to 2 Step -1
If .Cells(i,1).Value = “” Then Exit For
If .Cells(i,1).Value = “Test” Then .Rows(i).Delete
Next i
End With
Application.DisplayAlerts = True
End Sub

See the code below —

img3

You would have observed that the .Cells(1,i).value changes to .Cells(i,1).value in the above code.  This happens because in the first code, we were deleting columns so the variable “i” had to loop through the columns, while in the 2nd code, it needs to loop through the rows.  Here we will loop from the last row to the 2nd row, as the 1st row contains headers which need to be retained.

As per the code requirement, you can even merge both the delete rows and delete columns code into 1 code.  You can even put in multiple conditions based on which the row / column should be deleted.  Consider, we want to delete all rows where the 1st column contains text such as Test or Dummy, then the code will be like this –

Option Explicit
Sub macro4()
Dim i As Long, lrow As Long
Application.DisplayAlerts = False
With Worksheets(“Sheet1”)
lrow = .range(“A” & .Rows.Count).End(xlUp).Row
For i = lrow to 2 Step -1
If .Cells(i,1).Value = “” Then Exit For
If .Cells(i,1).Value = “Test”  Or .Cells(i,1).Value = “Dummy” Then .Rows(i).Delete
Next i
End With
Application.DisplayAlerts = True
End Sub

img4

Similarly, you can add on to this code or the code you have based on the requirement. You can add in multiple conditions for rows and even for columns.

image 48

Deleting Rows With For Each Loop Misses Rows

When I first attempted to delete rows using VBA code I thought it was going to be a piece of cake. I went into the VB Editor and typed out a simple For Each Loop in order to delete each row that contained the word ‘Product C’. With only a few lines of code, I was ready to test it out.

Unfortunately, after running the simple For Each loop code, there was still a row with “Product C” left!

Why was this? I clearly wrote VBA to delete all the rows with “Product C” in them!

Why You Can’t Use For Each Loops To Delete Rows

Well, when you take the time to think about what my For Each Loop was doing it was deleting a row and then moving on to the next row. 

The problem with this is that when you delete a row, it affects (shifts) the row numbers of everything below the row that was just deleted.  For instance, when Row 3 was deleted in our above example, Row 4 turned into Row 3 but the For Each Loop didn’t care!  The loop just went on to the next row (Row 4).

How To Correctly Delete Rows With VBA Loops

So if you can’t use a For Each loop, then how do you properly account for the row numbers shifting after your VBA code deletes a row? There are two solutions you can use that both rely on a For loop.

Loop In Reverse Method

The Loop in Reverse method starts at the bottom of your data set and works its way up. By doing this, the shifting of row numbers doesn’t impact your code.

There is a little add-on to the For Loop you can use to modify the loop’s direction and interval.  This add-on is called Step

We can use Step by starting with the last row in our data set and stepping backward in our loop by an interval of 1.  Take a look at the VBA code below to see this little feature in action.  

Notice by adding “Step -1” you are telling variable x that at the end of the loop you want x to subtract 1 from itself instead of doing the default of adding 1 to itself. 

Loop With A Step Back

An alternate way that you can delete rows without skipping any lines is by stepping your looping variable (x in my example) back by 1 if a row is in fact deleted. 

Inside your If/Then statement, which only allows rows that are getting deleted to enter, you can subtract 1 from your looping variable x so that when you get to the Next x statement or x value is repeated. 

So your loop would follow this pattern:
      enter loop: x = 3 —> delete row 3 —> x = 2 —> next x —> exit loop: x = 3

I Hope This Microsoft Excel Article Helped!

Hopefully, I was able to explain how you can properly use loops in VBA code to delete cell rows without accidentally skipping deletions. If you have any questions about this technique or suggestions on how to improve it, please let me know in the comments section below.

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!

— Chris

Like this post? Please share to your friends:
  • Delete all names in excel
  • Delete all macros in word
  • Delete all links excel
  • Delete all functions in excel
  • Delete all formula in excel