In this VBA Tutorial, you learn how to use Excel VBA to delete rows based on a variety of criteria.
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
VBA Statement Explanation
Worksheets.Rows(Row#).Delete
- Item: Worksheets.
- VBA Construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the worksheet you work with.
- 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.
- 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.
#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
VBA Statement Explanation
Worksheet.Rows(Row#).Delete Shift:=xlShiftUp
- Item: Worksheet.
- VBA Construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the worksheet you work with.
- 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.
- Item: Delete.
- VBA Construct: Range.Delete method.
- Description: Deletes the Range object returned by item #2 above.
- 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.
#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
VBA Statement Explanation
Worksheet.Rows(“FirstRow#:LastRow#”).Delete
- Item: Worksheet.
- VBA Construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the worksheet you work with.
- 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.
- 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.
#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
VBA Statement Explanation
ActiveCell.EntireRow.Delete
- Item: ActiveCell.
- VBA Construct: Application.ActiveCell property.
- Description: Returns a Range object representing the active cell.
- 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.
- 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.
#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
VBA Statement Explanation
Selection.EntireRow.Delete
- Item: Selection.
- VBA Construct: Application.Selection property.
- Description: Returns a Range object representing the current cell range selection.
- 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.
- 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.
#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
VBA Statement Explanation
Lines #1 and #11: With Worksheet | End With
- 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.
- 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
- 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).
- 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.
- 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.
- 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.
- 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
- 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.
- 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.
- Item: .Rows(Counter).
- VBA Construct: Worksheet.Rows property.
- Description: Returns a Range object representing the row through which the macro is currently looping.
- 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
- 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.
- 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.
- Item: BlankRows.
- VBA Construct: Object (Range) variable.
- Description: Holds a Range object representing the empty rows found by the macro.
- 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.
- Item: Nothing.
- Description: The default value for a data type. In the case of an object variable (such as BlankRows), a null reference.
- 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.
- 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”.
Line #5: Set BlankRows = Union(BlankRows, .Rows(Counter))
- Item: Set… =.
- VBA Construct: Set statement.
- Description: Assigns the object reference returned by item #6 below to BlankRows (item #2 below).
- 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.
- 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.
- 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.
- Item: .Rows(Counter).
- VBA Construct: Worksheet.Rows property.
- Description: Returns a Range object representing the row through which the macro is currently looping.
- 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:
In other words, any empty row the macro finds is “added” to BlankRows.
Line #6: Else
- 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)
- Item: Set… =.
- VBA Construct: Set statement.
- Description: Assigns the object reference returned by item #3 below to BlankRows (item #2 below).
- Item: BlankRows.
- VBA Construct: Object (Range) variable of Set statement.
- Description: Holds a Range object representing the empty rows found by the macro.
- 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
- 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
- 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.
- 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.
- Item: BlankRows.
- VBA Construct: Object (Range) variable.
- Description: Holds a Range object representing the empty rows found by the macro.
- 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.
- Item: Nothing.
- Description: The default value for a data type. In the case of an object variable (such as BlankRows), a null reference.
- 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.
- 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”.
- Item: BlankRows.
- VBA Construct: Object (Range) variable.
- Description: Holds a Range object representing the empty rows found by the macro.
- 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.
#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
VBA Statement Explanation
Lines #1 and #3: With Worksheet | End With
- 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.
- 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))
- Item: Set… =.
- VBA Construct: Set statement.
- Description: Assigns the object reference returned by items #3 through #5 below to RangeForCriteria (item #2 below).
- 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.
- 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.
- 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.
- 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
- 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
- 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.
- 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).
- 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.
- 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.
#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
VBA Statement Explanation
Lines #1 and #8: With Worksheet | End With
- 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.
- 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
- Item: With… End With.
- VBA Construct: With… End With statement.
- 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.
- 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.
- 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.
- 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:=”=”
- 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.
- 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.
- Item: Criteria1:=”=”.
- VBA Construct: Criteria1 parameter of Range.AutoFilter method.
- Description: Specifies the filtering criteria. “=” finds blank cells.
Line #4: On Error Resume Next
- 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
- 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.
- 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.
- Item: Resize.
- VBA Construct: Range.Resize property.
- Description: Resizes the cell range returned by items #1 and #2 above.
- 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).
- 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.
- Item: Count.
- VBA Construct: Range.Count property.
- Description: Returns the number of rows within the Range object returned by item #5 above.
- 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.
- 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.
- 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.
- Item: Delete.
- VBA Construct: Range.Delete method.
- Description: Deletes the Range object returned by item #10 above.
Line #7: .AutoFilterMode = False
- 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).
#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
VBA Statement Explanation
Lines #1 and #3: With Worksheet | End With
- 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.
- 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))
- Item: Set… =.
- VBA Construct: Set statement.
- Description: Assigns the object reference returned by items #3 through #5 below to RangeForCriteria (item #2 below).
- 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.
- 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.
- 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.
- 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
- 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
- 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.
- 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.
- 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.
- 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:
- 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 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.
#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
VBA Statement Explanation
Lines #1 and #8: With Worksheet | End With
- 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.
- 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
- Item: With… End With.
- VBA Construct: With… End With statement.
- 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.
- 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.
- 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.
- 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
- 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.
- 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.
- 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
- 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
- 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.
- 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.
- Item: Resize.
- VBA Construct: Range.Resize property.
- Description: Resizes the cell range returned by items #1 and #2 above.
- 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).
- 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.
- Item: Count.
- VBA Construct: Range.Count property.
- Description: Returns the number of rows within the Range object returned by item #5 above.
- 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.
- 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.
- 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.
- Item: Delete.
- VBA Construct: Range.Delete method.
- Description: Deletes the Range object returned by item #10 above.
Line #7: .AutoFilterMode = False
- 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).
#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
VBA Statement Explanation
Lines #1 and #13: With Worksheet | End With
- 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.
- 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
- 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).
- 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.
- 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.
- 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.
- 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
- 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.
- 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
- 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.
- 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.
- 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
- 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.
- 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.
- 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.
- 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.
- Item: Nothing.
- Description: The default value for a data type. In the case of an object variable (such as RowsWithDate), a null reference.
- 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.
- 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”.
Line #6: Set RowsWithDate = Union(RowsWithDate, .Cells)
- Item: Set… =.
- VBA Construct: Set statement.
- Description: Assigns the object reference returned by item #6 below to RowsWithDate (item #2 below).
- 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.
- 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.
- 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.
- 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.
- 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:
In other words, any cell containing the criteria date the macro finds is “added” to RowsWithDate.
Line #7: Else
- 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
- Item: Set… =.
- VBA Construct: Set statement.
- Description: Assigns the object reference returned by item #3 below to RowsWithDate (item #2 below).
- 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.
- 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
- 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
- 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.
- 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.
- 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.
- 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.
- Item: Nothing.
- Description: The default value for a data type. In the case of an object variable (such as RowsWithDate), a null reference.
- 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.
- 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”.
- 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.
- 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.
- 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).
#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
VBA Statement Explanation
Lines #1 and #8: With Worksheet | End With
- 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.
- 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
- Item: With… End With.
- VBA Construct: With… End With statement.
- 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.
- 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.
- 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.
- 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
- 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.
- 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.
- 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
- 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
- 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.
- 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.
- Item: Resize.
- VBA Construct: Range.Resize property.
- Description: Resizes the cell range returned by items #1 and #2 above.
- 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).
- 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.
- Item: Count.
- VBA Construct: Range.Count property.
- Description: Returns the number of rows within the Range object returned by item #5 above.
- 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.
- 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.
- 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.
- Item: Delete.
- VBA Construct: Range.Delete method.
- Description: Deletes the Range object returned by item #10 above.
Line #7: .AutoFilterMode = False
- 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).
References to VBA Constructs Used in this VBA Tutorial
Use the following links to visit the appropriate webpage within the Microsoft Office Dev Center:
- Identify the worksheet you work with:
- Workbook.Worksheets property.
- 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.
- Return Range objects:
- Application.ActiveCell property.
- Worksheet.Cells property.
- Range.Cells property.
- Range.Offset property.
- Range.Resize property.
- Application.Union method.
- Return Range objects representing rows:
- Worksheet.Rows property.
- Range.Rows property.
- Range.EntireRow property.
- Loop through rows:
- For… Next statement.
- Specify criteria for row deletion:
- DateSerial Function.
- DateValue Function.
- Range.Value property.
- 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.
- Delete rows.
- Range.Delete method.
- 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.
- Simplify object references:
- With… End With statement.
- Handle errors:
- On Error statement.
- Remove AutoFilter drop-down arrows:
- Worksheet.AutoFilterMode property.
Adding and deleting rows is part of everyday common tasks when working with Excel.
While you can do this easily from the worksheet itself, sometimes you may want to use the VBA route to delete rows in Excel. These could be deleting a specific row, multiple rows in the selection, deleting alternate rows or those that have a specific value in it.
In this tutorial, I will show you how to delete rows in Excel using VBA (multiple scenarios).
So let’s get started!
Delete an Entire Row using VBA
To delete an entire row in Excel using VBA, you need to use the EntireRow.Delete method.
For example, if you want to delete the entire first row in a worksheet, you can use the below code:
Sub DeleteEntireRow() Rows(1).EntireRow.Delete End Sub
The above code first specifies the row that needs to be deleted (which is done by specifying the number in bracket) and then uses the EntireRow.Delete method to delete it.
You can also delete multiple rows by specifying these rows in the code.
For example, the below code will delete row number 1, 5 and 9 in the worksheet:
Sub DeleteEntireRow() Rows(9).EntireRow.Delete Rows(5).EntireRow.Delete Rows(1).EntireRow.Delete End Sub
The above code uses the same logic, where it specifies the row numbers and Excel will delete these rows one by one.
IMPORTANT: When you’re deleting rows with something similar to the above code, remember to start deleting from the bottom and then go up. For example, in case you start at the top and delete row 1 first, all the rows below it would be shifted one row up and the numbering would be off (as row 5 would become row 4 and so on)
Delete All Rows in the Selection
In case you want to delete all the rows in a selected range of cells, you can use the VBA macro code below:
Sub DeleteEntireRow() Selection.EntireRow.Delete End Sub
The above code applies to the EntireRow.Delete method to the entire selection.
Delete Alternate rows (or Delete Every Third/Fourth/Nth Row)
Sometimes, you may get a data dump where every second row (or third, fourth or Nth rows) is useless and needs to be deleted.
I used to work with financial data where every second row was empty and had to be deleted.
This is the type of scenario where VBA really shines.
Below is the VBA code that will go through all the rows in the selection and delete every second row:
Sub DeleteAlternateRows() RCount = Selection.Rows.Count For i = RCount To 1 Step -2 Selection.Rows(i).EntireRow.Delete Next i End Sub
Let me explain how this VBA code works.
First, I have used a variable RCount to get the total number of rows in the selection.
Then I have used a For Next loop to run this as many times as many rows are there. For example, if there are 12 rows, this loop will run from 12 to 1 (i.e., 12 times). It’s important to run this from the last row in the selection to the first as we don’t want the row numbers to change when a row is deleted.
Also, Step -2 is used since we need to delete every other row (from bottom to top). In case you want to delete every third row, you can use -3.
Within the VBA loop, I have used the Selection.Rows(i).EntireRow.Delete method to delete every alternate row.
Delete Blank Rows with VBA
You can also use the EntireRow.Delete method to delete all blank rows.
Below is the VBA code that will select blank cells in the selected dataset and delete the entire row.
Sub DeleteBlankRows() Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub
The above code uses the SpecialCells property to select and delete all the cells that are blank. This is the same method that also allows us to use ‘Go To Special’ dialog box to select all blank cells.
Once these blank cells are identified using SpecialCell, these are then deleted using the EntireRow.Delete method.
Note: This method selects cells that are blank and don’t check whether the entire row is blank or not. So if anyone cell is empty in a row, this would still delete the entire row.
Delete Rows with a Specific Word/Value
You can also use a simple VBA code to go through each cell in the selected range and delete all the rows where a cell contains a specific text or value.
For example, suppose you have a dataset and I want to delete all cells that have the text Printer in column 2 of the selection.
Below is the code that will do this:
Sub DeleteRowswithSpecificValue() For i = Selection.Rows.Count To 1 Step -1 If Cells(i, 2).Value = "Printer" Then Cells(i, 2).EntireRow.Delete End If Next i End Sub
The above code first counts the total number of rows in the selection. This will make sure the loop is run only these many times. It then uses the ‘For Next loop’ to go through all the cells in Column 2.
The IF THEN ELSE statement is then used to check the value in each cell in column 2. And in case the value/text matches the specified text (which is ‘Printer’ in this example).
In this example, I have checked whether the text matches a specific string or not. You can also do this with values. For example, you can delete all rows where the sale value is less than 1000 or more than 1000.
Note: An important thing to note here is that the loop runs from Selection.Rows.Count To 1 to make sure when a row is deleted, it doesn’t impact the rows above it.
How to Use This VBA Code
Now let me show you how to use all the codes mentioned in this tutorial to delete the entire row.
You need to copy and paste these codes in a module in Excel VB Editor. Once you have these codes copied, you can then run the macro codes.
Below are the steps to copy and paste these VBA codes in a module:
- Hold the ALT key and press the F11 key (or Function + Option + F11 in Mac). This will open the VB Editor
- In the VB Editor, you will have the project explorer on the left. If you don’t see it, go to the View option and then click on Project Explorer.
- Right-click on any object in the Project Explorer (for the workbook in which you want to run the code).
- Go to Insert and then click on Module. This will insert a new Module for the workbook
- Copy and Paste the above codes in the module.
And to run these codes, you can place the cursor anywhere in the code (that you want to run) and hit the F5 key (or click on the green triangle in the VBA toolbar).
I have also written a detailed tutorial on different ways to run VBA macro codes in Excel.
In case you need to use any of these codes quite often, you can also consider adding these to the Personal Macro Workbook and then to the QAT. This way, the code will be available to you in any of your workbooks with a single click.
So these were some VBA codes that you can use to delete entire rows in Excel (in different scenarios). The same logic can also be applied in case you want to delete columns instead of rows (with the corresponding adjustment in the code examples).
Hope you found this tutorial useful!
You may also like the following Excel tutorials:
- Excel VBA Autofilter: A Complete Guide with Examples
- Delete Rows Based on a Cell Value (or Condition) in Excel
- Insert a Blank Row after Every Row in Excel (or Every Nth Row)
- How to Quickly Unhide COLUMNS in Excel
In this Article
- Delete Entire Row or Column
- Delete Multiple Rows or Columns
- Delete Blank / Empty Rows
- Delete Row if Cell is Blank
- Delete Row Based on Cell Value
- More Delete Row and Column Examples
- Delete Duplicate Rows
- Delete Table Rows
- Delete Filtered Rows
- Delete Rows in Range
- Delete Selected Rows
- Delete Last Row
- Delete Columns by Number
This tutorial will demonstrate different ways to delete rows and columns in Excel using VBA.
Delete Entire Row or Column
To delete an entire row in VBA use this line of code:
Rows(1).Delete
Notice we use the Delete method to delete a row.
Instead of referencing the Rows Object, you can reference rows based on their Range Object with EntireRow:
Range("a1").EntireRow.Delete
Similarly to delete an entire column, use these lines of code:
Columns(1).Delete
Range("a1").EntireColumn.Delete
Delete Multiple Rows or Columns
Using the same logic, you can also delete multiple rows at once:
Rows("1:3").Delete
or columns:
Columns("A:C").Delete
Notice here we reference the specific row and column numbers / letters surrounded by quotations.
Of course, you can also reference the EntireRow of a range:
Range("a1:a10").EntireRow.Delete
Note: The examples below only demonstrate deleting rows, however as you can see above, the syntax is virtually identically to delete columns.
Delete Blank / Empty Rows
This example will delete a row if the entire row is blank:
Sub DeleteRows_EntireRowBlank()
Dim cell As Range
For Each cell In Range("b2:b20")
If Application.WorksheetFunction.CountA(cell.EntireRow) = 0 Then
cell.EntireRow.Delete
End If
Next cell
End Sub
It makes use of the Excel worksheet function: COUNTA.
Delete Row if Cell is Blank
This will delete a row if specific column in that row is blank (in this case column B):
Range("b3:b20").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Delete Row Based on Cell Value
This will loop through a range, and delete rows if a certain cell value in that row says “delete”.
Sub DeleteRowswithSpecificValue()
Dim cell As Range
For Each cell In Range("b2:b20")
If cell.Value = "delete" Then
cell.EntireRow.Delete
End If
Next cell
End Sub
More Delete Row and Column Examples
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Delete Duplicate Rows
This code will delete all duplicate rows in a range:
Range("b2:c100").RemoveDuplicates Columns:=2
Notice we set Columns:=2. This tells VBA to check both the first two columns of data when considering if rows are duplicates. A duplicate is only found when both columns have duplicate values.
If we had set this to 1, only the first row would’ve been checked for duplicate values.
Delete Table Rows
This code will delete the second row in a Table by referencing ListObjects.
ThisWorkbook.Sheets("Sheet1").ListObjects("list1").ListRows(2).Delete
Delete Filtered Rows
To delete only rows that are visible after filtering:
Range("b3:b20").SpecialCells(xlCellTypeVisible).EntireRow.Delete
VBA Programming | Code Generator does work for you!
Delete Rows in Range
This code will delete all rows in range:
Range("a1:a10").EntireRow.Delete
Delete Selected Rows
This code will delete all selected rows:
Selection.EntireRow.Delete
Delete Last Row
This will delete the last used row in column B:
Cells(Rows.Count, 2).End(xlUp).EntireRow.Delete
By changing 2 to 1, you can delete the last used row in column A, etc.:
Cells(Rows.Count, 1).End(xlUp).EntireRow.Delete
Delete Columns by Number
To delete a column by it’s number, use a code like this:
Columns (2).Delete
Excel VBA Delete Row
Normally in an Excel worksheet, we have two different methods to delete rows: the keyboard shortcut and the right-click and insert method. But in VBA, we must use the “Delete” command and worksheet statement to delete any rows. The trick is that if we need to delete a single row, we give a single row reference, but for multiple columns, we give multiple row references.
Using VBA Delete Row method, we can delete all the blank rows and the row based on cell value. We can also delete the entire row if any cells are blank.
This article will discuss the method “VBA Delete Row.” Keep yourself occupied for the next 15 to 20 minutes to learn about the concept.
Table of contents
- Excel VBA Delete Row
- How to Delete Row?
- Example #1
- Example #2
- Example #3
- Example #4
- Example #5
- Example #6
- Recommended Articles
- How to Delete Row?
How to Delete Row?
You can download this VBA Delete Row Excel Template here – VBA Delete Row Excel Template
Example #1
In VBA, we need to mention the row we are deleting.
Code:
Sub DeleteRow_Example1() Cells(1, 1) End Sub
Cells (1, 1) means first-row first column, i.e., A1 cell. Then, we use the method “Delete.”
Code:
Sub DeleteRow_Example1() Cells(1, 1).Delete End Sub
Now, this will delete the first cell. All the right-side values will shift from one cell to the left.
Example #2
If you want to delete the entire row, we need to use the property “EntireRow,” then, we need to use the method “Delete” to delete the entire row of the cell we have selected.
Code:
Sub DeleteRow_Example2() Cells(1, 1).EntireRow.Delete End Sub
For example, we have entered a few characters in an Excel sheet.
If we run this code, it will delete the entire row, not a single cell.
Example #3
We can delete the row by using several ways. In the above example, we deleted the row using the CELLS property. Now, we will see how to delete by using the ROWS property.
Now, we need to mention what is the row we need to delete. For example, we need to delete the 5th row.
Now, use the “EntireRow” property.
After selecting the property, what do we need to do? First, we need to delete the row.
Code:
Sub DeleteRow_Example3() Rows(5).EntireRow.Delete End Sub
So, this code will delete the 5th row.
Example #4
Delete Multiple Rows by Using Range Object
How do we delete multiple rows?
We can use the VBA RANGE objectRange is a property in VBA that helps specify a particular cell, a range of cells, a row, a column, or a three-dimensional range. In the context of the Excel worksheet, the VBA range object includes a single cell or multiple cells spread across various rows and columns.read more to delete more than one row. For example, assume you have some values from A1 to A6 cells.
Now, we want to delete the first five rows, so we can reference these rows by using the Range object as “Range (“A1: A5”).“
Code:
Sub DeleteRow_Example4() Range ("A1: A5") End Sub
Now, we want to use the word “EntireRow” property.
Code:
Sub DeleteRow_Example4() Range("A1:A5").EntireRow End Sub
In this row, we need to perform the method of deleting, so use the “Delete” method.
Code:
Sub DeleteRow_Example4() Range("A1:A5").EntireRow.Delete End Sub
Now, this will delete the selected rows.
Example #5
Delete Rows Based On Cell Value
We can also use this “EntireRow.Delete” method to delete the row based on the cell value in VBAIn VBA, there are two ways to interact with or get value from a cell: the range method and the cell method.read more. For example, we have “Yes” and “No” values from cells A1 to A10.
We need to delete the rows with the value “No.” We must use the function “IF” with loops to delete all the rows with the value of “No” to perform this task.
The below code will do the job for us.
Code:
Sub DeleteRow_Example5() Dim k As Integer For k = 10 To 1 Step -1 If Cells(k, 1).Value = "No" Then Cells(k, 1).EntireRow.Delete End If Next k End Sub
Example #6
Delete All the Blank Cells Rows
There are situations where we need to delete the entire row if any of the cells in the range are blank. For example, we have the below set of data.
All the colored cells are blank, so we must delete the entire row. We can perform this task with two sets of code. Below is the code.
Code:
Sub DeleteRow_Example6() Range("A1:F10").SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub
It will identify the blank cells in the range A1 to F10. If it finds any blank cells, it will delete the entire row.
The problem with this code is it will only delete the blank cell’s row in the range A1 to F10. But if any cells are blank in any other cells, it will not delete them. So, keeping this in mind, we have written one more code.
Code:
Sub DeleteRow_Example7() Dim RangeToDelete As Range Dim DeletionRange As Range Set RangeToDelete = Application.InputBox("Please select the range", "Blank Cells Rows Deletion", Type:=8) Set DeletionRange = RangeToDelete RangeToDelete.SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub
When you run this code, firstly, it will ask you to select the range with an input box appearing in front of you.
After selecting the range, you need to click on “OK.” It will delete all the blank cells rowsThere are several methods for deleting blank rows from Excel: 1) Manually deleting blank rows if there are few blank rows 2) Use the formula delete 3) Use the filter to find and delete blank rows.read more in the selected range.
Recommended Articles
This article has been a guide to VBA Delete Row. Here, we discussed how to delete rows using VBA codes and practical examples. Below are some useful Excel articles related to VBA: –
- Excel VBA Delete Column
- VBA Last Row
- How to Code in VBA?
- Format Number in VBA
- VBA INT
Chris Nielsen’s solution is simple and will work well. A slightly shorter option would be…
ws.Rows(Rand).Delete
…note there is no need to specify a Shift when deleting a row as, by definition, it’s not possible to shift left
Incidentally, my preferred method for deleting rows is to use…
ws.Rows(Rand) = ""
…in the initial loop. I then use a Sort function to push these rows to the bottom of the data. The main reason for this is because deleting single rows can be a very slow procedure (if you are deleting >100). It also ensures nothing gets missed as per Robert Ilbrink’s comment
You can learn the code for sorting by recording a macro and reducing the code as demonstrated in this expert Excel video. I have a suspicion that the neatest method (Range(«A1:Z10»).Sort Key1:=Range(«A1»), Order1:=xlSortAscending/Descending, Header:=xlYes/No) can only be discovered on pre-2007 versions of Excel…but you can always reduce the 2007/2010 equivalent code
Couple more points…if your list is not already sorted by a column and you wish to retain the order, you can stick the row number ‘Rand’ in a spare column to the right of each row as you loop through. You would then sort by that comment and eliminate it
If your data rows contain formatting, you may wish to find the end of the new data range and delete the rows that you cleared earlier. That’s to keep the file size down. Note that a single large delete at the end of the procedure will not impair your code’s performance in the same way that deleting single rows does
Bottom Line: Learn how to use VBA macros to delete rows based on cell values or conditions. Includes video tutorial and sample code.
Skill Level: Intermediate
Video Tutorial
Download the Excel File
Here is the file I use in the video above that contains the VBA macro code examples.
Does your data preparation process include deleting the same rows based on a condition? If so, you can use a macro to instantly delete any rows that have a particular value, date, or even blank cells.
The overall process is two simple steps:
- The first step is to filter the rows based on filter criteria for the values to be deleted.
- Then the macro deletes the visible cells in the range.
The Process Explained
Below is an image of a data set that has some blank cells in column E (Product). You can see one of those blank cells is E6.
To remove the rows that have blank cells like this one, the macro first applies a filter to the product column.
Next, the macro simply deletes all of the visible rows that have been left by the filter. It uses the SpecialCells method to create a reference to the visible cells.
This is the same as using the Go To Special menu (keyboard shortcut Alt+;) to select blanks. Checkout my article and video on how to copy & paste visible cells to learn more.
Finally, the macro can also clear the filters so that you are left viewing the entire data range, minus the rows you’ve deleted.
It’s a simple 2 or 3 step macro that will save time from doing this process manually.
Important Note: I added a step to clear all filters in the range or Table at the beginning of the macro. This ensures that there are no filters applied to other columns that could cause additional rows to be filtered out.
A big thanks to Hoang for pointing this out on the YouTube video!
The VBA Macro Code
The VBA code below can be copy/pasted to the VB Editor. The code is also included in the Excel file in the Download section above.
Sub Delete_Rows_Based_On_Value()
'Apply a filter to a Range and delete visible rows
'Source: https://www.excelcampus.com/vba/delete-rows-cell-values/Dim ws As Worksheet
'Set reference to the sheet in the workbook.
Set ws = ThisWorkbook.Worksheets("Regular Range")
ws.Activate 'not required but allows user to view sheet if warning message appears
'Clear any existing filters
On Error Resume Next
ws.ShowAllData
On Error GoTo 0
'1. Apply Filter
ws.Range("B3:G1000").AutoFilter Field:=4, Criteria1:=""
'2. Delete Rows
Application.DisplayAlerts = False
ws.Range("B4:G1000").SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'3. Clear Filter
On Error Resume Next
ws.ShowAllData
On Error GoTo 0
End Sub
You will just need to update the Worksheet and Range references for your specific file.
Avoiding the Pop-up Warning
When you run the macro you will receive a pop-up warning message that says “Delete entire sheet row?”
If you want to run the macro without having that pop-up box interrupting, you can simply remove the apostrophes before the two lines of code that begin with Application.DisplayAlerts.
So that portion of the macro now looks like this:
'2. Delete Rows
Application.DisplayAlerts = False
ws.Range("B4:G1000").SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
The Application.DisplayAlerts property is a toggle to turn warning alerts on/off. Setting it to False will turn off the alerts. These are alerts you might see from Excel when deleting ranges, deleting sheets, closing without saving, etc.
Applying the Macro to Tables
If your data is in an Excel Table instead of just a range of cells, you can still delete rows based on cell contents using a macro. The code is almost the same, but tweaked slightly so that it applies to Tables. Here is the code you would use for a Table.
Sub Delete_Rows_Based_On_Value_Table()
'Apply a filter to a Table and delete visible rows
'Source: https://www.excelcampus.com/vba/delete-rows-cell-values/Dim lo As ListObject
'Set reference to the sheet and Table.
Set lo = Sheet3.ListObjects(1)
ws.Activate
'Clear any existing filters
lo.AutoFilter.ShowAllData
'1. Apply Filter
lo.Range.AutoFilter Field:=4, Criteria1:="Product 2"
'2. Delete Rows
Application.DisplayAlerts = False
lo.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'3. Clear Filter
lo.AutoFilter.ShowAllData
End Sub
Additional Macros
I’ve also included a few additional macros to help customize the process further.
Custom Warning Message
You can create a custom message box before deleting rows, instead of the default Excel warning to delete rows. The macro below also tells you the number of rows it is going to delete, and asks if you want to proceed.
Sub Delete_Rows_Based_On_Value_Table_Message()
'Display Yes/No message prompt before deleting rows
'Source: https://www.excelcampus.com/vba/delete-rows-cell-values/Dim lo As ListObject
Dim lRows As Long
Dim vbAnswer As VbMsgBoxResult
'Set reference to the sheet and Table.
Set lo = Sheet6.ListObjects(1)
lo.Parent.Activate 'Activate sheet that Table is on.
'Clear any existing filters
lo.AutoFilter.ShowAllData
'1. Apply Filter
lo.Range.AutoFilter Field:=4, Criteria1:="Product 2"
'Count Rows & display message
On Error Resume Next
lRows = WorksheetFunction.Subtotal(103, lo.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible))
On Error GoTo 0
vbAnswer = MsgBox(lRows & " Rows will be deleted. Do you want to continue?", vbYesNo, "Delete Rows Macro")
If vbAnswer = vbYes Then
'Delete Rows
Application.DisplayAlerts = False
lo.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'Clear Filter
lo.AutoFilter.ShowAllData
End If
End Sub
This is what the custom pop-up box looks like:
This pop-up just serves as a check before deleting rows. It’s a great way to double check everything looks good before deleting. It also prevents you or your users from accidentally running the macro.
Checkout my video on how to add a Yes/No message box before the macro runs for details on this code. It’s part of my 4 part video series on the Personal Macro Workbook.
Deleting Rows Based on Multiple Criteria
You can also delete rows with a macro using more than one criteria. In the video above, I filter for rows that have both a blank Product field and a date before 1/1/2015.
Sub Delete_Rows_Based_On_Multiple_Values()
'Apply a filter to a Table and delete visible rows
'Source: https://www.excelcampus.com/vba/delete-rows-cell-values/Dim lo As ListObject
'Set reference to the sheet and Table.
Set lo = Sheet5.ListObjects(1)
lo.Parent.Activate 'Activate sheet that Table is on.
'Clear any existing filters
lo.AutoFilter.ShowAllData
'1. Apply Filter - Blanks in Product for before 2015 only
lo.Range.AutoFilter Field:=4, Criteria1:=""
lo.Range.AutoFilter Field:=1, Criteria1:="<1/1/2015"
'2. Delete Rows
Application.DisplayAlerts = False
lo.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'3. Clear Filter
lo.AutoFilter.ShowAllData
End Sub
This allows you to delete rows based on values in multiple columns. The filtering essentially uses AND logic between the columns and all conditions must be met.
If you want to use OR logic where any of the conditions are met, you can run multiple macros, or create a formula in a helper column with the logic.
Depending on the logic, it might be easiest to just create two separate macros. You can put the code all in one macro, or create another macro to call each macro. Here’s an example of what that macro might look like.
Sub Delete_Rows() Call Delete_Blank_Rows
Call Delete_Before_2015
End Sub
This method also allows you to run each macro individually.
Delete Rows Based on Criteria Specified by User
Daniel and Bob asked a great question in the comments below. They want the user of the file to be able to specify the filter criteria, instead of having it hard-coded in the macro.
We can use the Application.InputBox method to ask the user to input the criteria.
The InputBox method creates a pop-up message box that allows the user to type in the text box. The value in the text box is passed back to the macro and stored in a variable.
Here is the VBA code. I also added it to the sample file in the downloads section above.
Sub Delete_Rows_User_Input()
'Display Yes/No message prompt before deleting rows
'Source: https://www.excelcampus.com/vba/delete-rows-cell-values/Dim lo As ListObject
Dim lRows As Long
Dim vbAnswer As VbMsgBoxResult
Dim sCriteria As Variant
'Set reference to the sheet and Table.
Set lo = Sheet9.ListObjects(1)
lo.Parent.Activate 'Activate sheet that Table is on.
'Clear any existing filters
lo.AutoFilter.ShowAllData
'Ask user for input
sCriteria = Application.InputBox(Prompt:="Please enter the filter criteria for the Product column." _
& vbNewLine & "Leave the box empty to filter for blanks.", _
Title:="Filter Criteria", _
Type:=2)
'Exit if user presses Cancel button
If sCriteria = False Then Exit Sub
'1. Apply Filter
lo.Range.AutoFilter Field:=4, Criteria1:=sCriteria
'Count Rows & display message
On Error Resume Next
lRows = WorksheetFunction.Subtotal(103, lo.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible))
On Error GoTo 0
vbAnswer = MsgBox(lRows & " Rows will be deleted. Do you want to continue?", vbYesNo, "Delete Rows Macro")
If vbAnswer = vbYes Then
'Delete Rows
Application.DisplayAlerts = False
lo.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'Clear Filter
lo.AutoFilter.ShowAllData
End If
End Sub
Pre-fill the User’s Name in the Input Box
Daniel also had a question about setting the filter criteria to the current user’s name. The Application.UserName property actually returns this value as long as the user has set it properly in Office/Excel.
We can use this as the Default parameter value in the input box.
sCriteria = Application.InputBox(Prompt:="Please enter the filter criteria for the Product column." _
& vbNewLine & "Leave the box empty to filter for blanks.", _
Title:="Filter Criteria", _
Default:=Application.UserName, _
Type:=2)
The user might still need to change the name if it does not match the value in the worksheet column you are filtering, but you can also get that synced up with the user to save them a lot of time.
Related Topics
Check out my posts on these similar topics as well.
- The Ultimate Guide to Filters with VBA Macros
- How to Copy and Paste Visible Cells Only
- 3 Ways to Delete Entire Blank Rows
- How to Create Your Personal Macro Workbook
Conclusion
Macros like this can be especially helpful if you are looking to clean up data and get rid of entries that you know you don’t need–maybe because they are too old or they are only partially complete.
There are a lot of ways to accomplish this task. Another common approach is to loop through cells and check their values individually.
However, I typically use this approach because it can be a lot faster to use the built in filters in Excel. It also allows us to preview the range before we delete it.
What will you use these macros for? Please leave a comment below with any suggestions and questions. Thank you! 🙂
VBA Delete Row – Excel Examples Macros Codes
Excel VBA code to Delete Rows examples Macros will help us to delete rows from excel worksheet in various criteria. We can use VBA delete row macros to delete entire row, blank cells or empty rows, move up or shift up, delete row if cell contains a string, date or value, from a sheet, table and range. We will use Rows().Delete method to delete the rows in of Microsoft Excel 2003, Excel 2007, Excel 2010, and Excel 2013. Excel VBA Macro code for deleting rows macro will help you to know how to delete rows in excel.
VBA code to Delete Rows in Excel
Following are the VBA Syntax and sample VBA macro commands to Delete Rows from worksheet using Excel VBA. We will see the various examples to delete the rows in different situations.
VBA code Example Macros to Delete Entire Row
The following Excel VBA Example macro code is to delete entire row from the worksheet. This VBA macro will delete the first row in the worksheet.
Sub sbVBS_To_Delete_EntireRow () Rows(1).EntireRow.Delete End Sub
If you execute this macro, this will delete the first row from the worksheet as we mentioned 1 in the code. Similarly, we can use any number to delete the specific row using VBA.
Rows(
[Row Number]).EntireRow.Delete
Here Row Number is your row number to delete. And EntireRow.Delete method will delete the Entire row from the Excel spreadsheet.
Delete Entire Row using VBA – Excel Macro Example Code
VBA Delete Row:Example Macro code to Delete Active Row
The following Excel VBA Example macro code is to delete active row from the worksheet. This VBA macro will delete the row of the currently active cell in the worksheet.
Sub sbVBS_To_Delete_Active_Rows() Rows(ActiveCell.Row).Delete End Sub
If you execute this macro, this will delete the active row from the worksheet as we mentioned ActiveCell.Row in the code. ActiveCell.Row returns the row number of the currently active cell.
Rows(ActiveCell.Row).EntireRow.Delete
Here ActiveCell.Row return the row number of the active cell. And EntireRow.Delete method will delete the rows from the Excel spreadsheet.
Delete Active row using VBA
VBA code Example Macros to delete blank rows in a Range
The following Excel VBA Example macro code is to delete blank rows in a range from the worksheet. This VBA macro will delete the blank rows in a range in the worksheet.
Sub sbVBS_To_Delete_Blank_Rows_In_Range() Dim iCntr Dim rng As Range Set rng = Range("A10:D20") For iCntr = rng.Row + rng.Rows.Count - 1 To rng.Row Step -1 If Application.WorksheetFunction.CountA(Rows(iCntr)) = 0 Then Rows(iCntr).EntireRow.Delete Next End Sub
If you execute this macro, this will delete the blank rows in a range. We are checking the blank rows using if condition and CountA function to determine the row is blank. And then we are using Delete method of rows to delete the rows in a Excel range.
If Application.WorksheetFunction.CountA(Rows(RowNumber)) = 0 Then Rows(RowNumber).EntireRow.Delete
Here Application.WorksheetFunction.CountA will check if the row is blank. And the Rows.delete method will delete the row if row is blank.
Delete blank rows in a range using VBA
VBA code Example Macros to delete blank rows in a Table
The following Excel VBA Example macro code is to delete blank rows in a table from the worksheet. This VBA macro will delete the blank rows in a table in the worksheet.
Sub sbVBS_To_Delete_Blank_Rows_In_Table() Dim iCntr As Long Dim rng As Range Set rng = ActiveSheet.ListObjects("Table1").Range For iCntr = rng.Row + rng.Rows.Count - 1 To rng.Row Step -1 If Application.WorksheetFunction.CountA(Rows(iCntr)) = 0 Then Rows(iCntr).EntireRow.Delete Next End Sub
If you execute this macro, this will delete the blank rows in table. We are checking the blank rows using if condition and CountA function to determine the row is blank in the table. And then we are using Delete method of rows to delete the rows in a table.
If Application.WorksheetFunction.CountA(Rows(RowNumber)) = 0 Then Rows(RowNumber).EntireRow.Delete
Here Application.WorksheetFunction.CountA will check if the row is blank. And the Rows.delete method will delete the row if row is blank.
Delete blank rows in a table using VBA
VBA code Example Macros to delete hidden rows
The following Excel VBA Example macro code is to hidden rows from the worksheet. This VBA macro will delete the hidden rows in a worksheet.
Sub sbVBS_To_Delete_Hidden_Rows() Dim lastRow lastRow = 100 For iCntr = lastRow To 1 Step -1 If Rows(iCntr).Hidden = True Then Rows(iCntr).EntireRow.Delete Next End Sub
If you execute this macro, this will delete the hidden rows in a worksheet. We are checking the rows using Hidden property of a row and then deleting if the row is hidden.
If Rows(RowNumber).Hidden = True Then Rows(RowNumber).EntireRow.Delete
Here Rows(RowNumber).Hidden is to check if the row is hidden. And EntireRow.Delete method will delete the rows from the Excel spreadsheet if they are hidden.
Delete Hidden Rows using VBA
VBA code Example Macros to delete multiple rows
The following Excel VBA Example macro code is to multiple rows from the worksheet. This VBA macro will delete the multiple rows at one shot from a worksheet.
Sub sbVBS_To_Delete_Multiple_Rows () Rows(“1:3”).EntireRow.Delete End Sub
If you execute this macro, this will delete the multiple rows from a worksheet. We can specify any number of rows (starting and ending row number) based on the system memory.
Rows(“[Row Numbers]”).EntireRow.Delete
Here Row Numbers are your row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete Multiple Rows using VBA – Excel Macro Example Code
VBA code Example Macros to delete rows based on Cell Color
Following is the VBA syntax and sample VBA code to delete rows based on Cell fill Color from worksheet using VBA. We are using the Delete method of the Rows object of worksheet to delete rows.
Sub sbDelete_Rows_Based_On_Cell_Color() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1).Interior.ColorIndex = 3 Then ‘3=Red Rows(iCntr).Delete End If Next End Sub The above VBA code is to delete rows based on Cell Color from the excel worksheet. This code will delete the rows (1 to 20) if it satisfy the color condition if cell background is red (Interior.ColorIndex=3). <code> If <color criteria> Then Rows(“[Row Numbers]”).EntireRow.Delete </code> Here <color criteria> is the color condition which you want to check to delete rows. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet. <a href="https://analysistabs.com/vba/delete-rows-based-on-cell-color-excel-macro-example-code/" class="more-link" title="Delete rows based on Cell Color using VBA">Delete rows based on Cell Color using VBA</a> <H3>VBA code Example Macros to delete rows based on Cell font Color </H3> Following is the VBA syntax and sample VBA code to delete rows based on Cell font Color from worksheet using VBA. We are using the Delete method of the Rows object of worksheet to delete rows.Sub sbDelete_Rows_Based_On_Cell_Color() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1).Font.ColorIndex = 3 Then ‘3=Red Rows(iCntr).Delete End If Next End SubThe above VBA code is to delete rows based on Cell font Color from the excel worksheet. This code will delete the rows (1 to 20) if it satisfy the color condition if cell font color is red (Font.ColorIndex = 3).
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here is the color condition which you want to check to delete rows. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows based on Cell font Color using VBAVBA code Example Macros to delete rows based on cell value
Following is the VBA syntax and sample VBA code to delete rows based on cell value from worksheet using VBA. We are checking the cell value and using the Delete method of the Rows object of worksheet to delete rows.
Sub sbDelete_Rows_Based_On_Criteria() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1) = 10 Then Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here cell value criteria is the condition which you want to check the cells to delete rows. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows based on cell value using Excel VBAVBA code Example Macros to delete rows based on Criteria
Following is the VBA syntax and sample VBA code to delete rows based on criteria from worksheet using VBA. We are checking the cell for criteria and using the Delete method of the Rows object of worksheet to delete rows.
Sub sbDelete_Rows_Based_On_Criteria() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1) = 1 Then Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here criteria is the condition which you want to check to delete rows. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows based on criteria using VBAVBA code Example Macros to delete rows based on Date
Following is the VBA syntax and sample VBA code to delete rows based on Date from worksheet using VBA. We are checking the cell value for a specific date and using the Delete method of the Rows object of worksheet to delete rows.
Sub sbDelete_Rows_Based_On_Date() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Format(Cells(iCntr, 1), "dd-mm-yyyy”) = Format(Now(), "dd-mm-yyyy") Then Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here is the date condition which you want to check to delete rows. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows based on Date using VBAVBA code Example Macros to delete rows based on multiple criteria
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets based o multiple criteria. This will help you to know how to delete specific rows based on multiple conditions from Excel workbook using VBA.
Sub sbDelete_Rows_Based_On_Multiple_Criteria() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1) = 1 or trim(Cells(iCntr, 1)) = “” Then Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here is the conditions which you want to check to delete rows. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows based on multiple criteria using VBAVBA code Example Macros to delete rows if cell contains Error value
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets if cell contains Error value. This will help you to know how to delete specific rows if cell contains Error value from Excel workbook using VBA.
Sub sbDelete_Rows_IF_Cell_Contains_Error() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If IsError(Cells(iCntr, 1)) Then Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here to check if the cell contains any error. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows if cell contains Error value using VBAVBA code Example Macros to delete rows if cell contains Number value
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets if cell contains Number value. This will help you to know how to delete specific rows if cell contains Number value from Excel workbook using VBA.
Sub sbDelete_Rows_IF_Cell_Contains_Error() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If isNumeric(Cells(iCntr, 1)) Then Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here to check if the cell contains any error. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows if cell contains Number value using VBAVBA code Example Macros to delete rows if cell contains string value
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets if cell contains string value. This will help you to know how to delete specific rows if cell contains string value from Excel workbook using VBA.
Sub sbDelete_Rows_IF_Cell_Cntains_String_Text_Value() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1) = “Your String” Then ‘ You can change this text Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here to check if the cell contains a specific text. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows if cell contains string value using VBAVBA code Example Macros to delete rows if cell is 0 (equals to zero)
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets if cell is 0 (equals to zero). This will help you to know how to delete specific rows if cell is 0 (equals to zero) from Excel workbook using VBA.
Sub sbDelete_Rows_IF_Cell_Contains_Error() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1)=0 Then Rows(iCntr).Delete End If Next End Sub
If < (cell value)=0> Then Rows(“[Row Numbers]”).EntireRow.Delete
Here < (cell value)=0> to check if the cell contains 0 (zero). And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows if cell is 0 (equals to zero) using VBAVBA code Example Macros to delete rows if Cell is Empty
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets if Cell is Empty/Blanks. This will help you to know how to delete specific rows if Cell is Empty/Blanks from Excel workbook using VBA.
Sub sbDelete_Rows_IF_Cell_Is_Blank() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If trim(Cells(iCntr, 1)) = “” Then Rows(iCntr).Delete End If Next End Sub
If trim() =”” Then Rows(“[Row Numbers]”).EntireRow.Delete
Here trim() =””is to check if the cell is empty. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete row if Cell is Empty/Blank using Excel VBAVBA code Example Macros to delete rows in range
Here is the Example VBA syntax and Example VBA Macro to delete rows in range from excel worksheets. This will help you to know how to delete specific rows in a range from Excel workbook using VBA.
Sub sbVBS_To_Delete_Rows_In_Range() Dim iCntr Dim rng As Range Set rng = Range("A10:D20") For iCntr = rng.Row + rng.Rows.Count - 1 To rng.Row Step -1 Rows(iCntr).EntireRow.Delete Next End Sub
Rows(RowNumber).EntireRow.Delete
Here Rows.delete method will delete the row in the worksheet.
Delete rows in a range using VBAVBA code Example Macros to delete rows shift up
Here is the Example VBA syntax and Example VBA Macro to delete rows to shift up cells from excel worksheets. This will help you to know how to delete specific rows shift up from Excel workbook using VBA.
Sub sbDelete_Rows_IF_Cell_Contains_Error() Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1)=0 Then Range("A" & iCntr).Delete Shift:=xlUp End If Next End Sub
Range("Your Range”).Delete Shift:=xlUp
Here Range("Your Range”) is your range to delete. And Shift:=xlUp tells excel to shift up the cells not to delete entire row.
Delete rows shift up using VBAVBA code Example Macros to delete rows with specific data values
Here is the Example VBA syntax and Example VBA Macro to delete rows from excel worksheets with specific data values. This will help you to know how to delete specific rows with specific data values from Excel workbook using VBA.
Sub sbDelete_Rows_With_Specific_Data () Dim lRow As Long Dim iCntr As Long lRow = 20 For iCntr = lRow To 1 Step -1 If Cells(iCntr, 1) = “Your Data” Then ‘ You can change this text ‘If Cells(iCntr, 1) = “22-12-2013” Then ‘ to check specific date Rows(iCntr).Delete End If Next End Sub
If Then Rows(“[Row Numbers]”).EntireRow.Delete
Here to check if the cell contains a specific data. And Row Numbers are the row numbers to delete. And EntireRow.Delete method will delete the Entire rows from the Excel spreadsheet.
Delete rows with specific value using VBA – Excel VBA Macro Example Code
A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.
Save Up to 85% LIMITED TIME OFFER
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates
Excel Pack
50+ Excel PM Templates
PowerPoint Pack
50+ Excel PM Templates
MS Word Pack
25+ Word PM Templates
Ultimate Project Management Template
Ultimate Resource Management Template
Project Portfolio Management Templates
Related Posts
- VBA code to Delete Rows in Excel
- VBA code Example Macros to Delete Entire Row
- VBA Delete Row:Example Macro code to Delete Active Row
- VBA code Example Macros to delete blank rows in a Range
- VBA code Example Macros to delete blank rows in a Table
- VBA code Example Macros to delete hidden rows
- VBA code Example Macros to delete multiple rows
- VBA code Example Macros to delete rows based on Cell Color
- VBA code Example Macros to delete rows based on cell value
- VBA code Example Macros to delete rows based on Criteria
- VBA code Example Macros to delete rows based on Date
- VBA code Example Macros to delete rows based on multiple criteria
- VBA code Example Macros to delete rows if cell contains Error value
- VBA code Example Macros to delete rows if cell contains Number value
- VBA code Example Macros to delete rows if cell contains string value
- VBA code Example Macros to delete rows if cell is 0 (equals to zero)
- VBA code Example Macros to delete rows if Cell is Empty
- VBA code Example Macros to delete rows in range
- VBA code Example Macros to delete rows shift up
- VBA code Example Macros to delete rows with specific data values
VBA Reference
Effortlessly
Manage Your Projects
120+ Project Management Templates
Seamlessly manage your projects with our powerful & multi-purpose templates for project management.
120+ PM Templates Includes:
Effectively Manage Your
Projects and Resources
ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.
We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.
Project Management
Excel VBA
Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.
Page load link
Go to Top
VBA Delete Row
In Excel, to delete any row, we have a shortcut of using CTRL + – or select the row, right-click on it, and delete it. But in VBA, we have done it by writing a code for it. Therefore, the method of deleting a row in VBA is first we need to identify which row to delete, and then we can delete it. In this article, we will learn about different illustrations on how to delete a row in VBA.
In VBA, the Delete row is used to delete either a set of rows or a single row depending upon the situation. Similar to an excel worksheet, we can use macros or VBA to delete the rows in an excel worksheet. This helps when lots of data have with us, and we cannot do it manually.
Syntax to Delete Row in Excel VBA
The syntax to delete a row in excel is as below.
Worksheets.Rows(Row#).Delete
There are also other methods to delete rows by using VBA such as follows.
Range(“Cell”).EntireRow.Delete
What the above statement will do that is it will delete the row for the given row. For example, if we write Range(“A1”).EntireRow.Delete then the first row will be deleted as cell A1 belongs to the first row.
Also, we can use Rows(row_num).delete to delete a row.
How to Delete Row in Excel Using VBA?
Below are some examples of how to delete a row in excel using VBA.
You can download this VBA Delete Row Excel Template here – VBA Delete Row Excel Template
VBA Delete Row – Example #1
Let use the first simple method to delete rows. For demonstration purpose, I will enter a random value in cell A1 and B1. Have a look at it below.
What I want to see is if I use the code written above the entire row will be deleted or a single cell will be deleted.
Note: To use Excel VBA we must have developer tab enabled from Files tab in the options section.
Follow the below steps to delete row in excel using VBA.
Step 1: Go to the developer’s Tab click on Visual Basic to open VBA Editor.
Step 2: In the code segment declare a sub-function to start writing the code.
Code:
Sub Sample() End Sub
Step 3: Now write the following code to delete the row.
Code:
Sub Sample() Range("A1").EntireRow.Delete End Sub
Step 4: Run this code by hitting F5 or Run button and see the output.
Once we run the code we can see that the values from both cell A1 and B1 are removed as the entire first row has been deleted.
VBA Delete Row – Example #2
Earlier in the first example, I have deleted only a single row. But what about if we have to delete multiple rows. For demonstration purpose, I have the following data as shown below,
I want to delete all the first five rows. Follow below steps to delete row in excel using VBA.
Step 1: In the developer’s tab click on Visual Basic to open VBA Editor.
Step 2: In the code declare a sub-function to start writing the code,
Code:
Sub Sample1() End Sub
Step 3: Write the following code shown below to delete the entire five rows.
Code:
Sub Sample1() Range("A1:B5").EntireRow.Delete End Sub
Step 4: Run this code by hitting F5 or Run button and see the output.
Once we run the code we see the following result, The entire data has been deleted means the first five rows have been deleted as we had data in the first five rows.
Note: I will Insert back the data in the excel sample sheet for demonstration.
VBA Delete Row – Example #3
Now we have data for employees and their sales are done in three months Jan, Feb, and March. One of the employees was on leave and couldn’t do sales for three months so the cells are empty for him. Our goal is to find that blank row and delete it from the data.
Have a look at the data below,
Follow below steps to delete row in excel using VBA.
Step 1: From the developer’s Tab click on Visual Basic to open a visual basic editor.
Step 2: Declare the subfunction in the code window to start writing the code,
Code:
Sub Sample2() End Sub
Step 3: Write the following code to delete the rows which have blank cells.
Code:
Sub Sample2() Range("A1:D5").SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub
SpecialCells is a function in VBA which returns us all the cells which match our conditions and our condition was the blank cells in that range so we used an xlCellTypeBlanks function.
Step 4: Run this code by hitting F5 or Run button and see the output.
Once we run the code we can see that the row which had the blank cells has been deleted.
Note: I will again Insert back the data in the excel sample sheet for demonstration.
VBA Delete Row – Example #4
There are some other similar methods to delete the rows such as using the rows and delete function. For example, we have data in row 4 and I want to delete row 4. We can give a command to excel to delete 4th row in the data. Have a look at the screenshot below I have a random data at row 4 in the first cell.
Follow below steps to delete row in excel using VBA.
Step 1: Open VBA Editor by clicking on Visual Basic from the Developer’s Tab,
Step 2: Declare the subfunction to start writing the code.
Code:
Sub Sample3() End Sub
Step 3: Write the following code to delete the 4th row.
Code:
Sub Sample3() Rows(4).Delete End Sub
Step 4: Run this code by hitting F5 or Run button and see the output.
Data has been deleted as the 4th row has been deleted itself.
VBA Delete Row – Example #5
In the above code, we have given the range or row to delete in the code itself. Now let us take input from the user and he can delete the row from a given data. For example, I have data of employees and sales did as below and I want a user to select the range from how much data the user wants to delete the rows with blank cells. Have a look at the below data,
Follow below steps to delete row in excel using VBA.
Step 1: Open VB Editor by clicking on Visual Basic from the developer’s tab,
Step 2: Declare a sub-function to start writing the code.
Code:
Sub Sample4() End Sub
Step 2: Declare two variables as range, A and B.
Code:
Sub Sample4() Dim A As Range Dim B As Range End Sub
Step 3: To take input from the user for a selection of range to delete we will use input box function and we will save that input in a variable defined above.
Code:
Sub Sample4() Dim A As Range Dim B As Range Set A = Application.InputBox("Select Data", "Sample Macro", Type:=8) End Sub
Step 4: Set B = A so that the input from the user can be stored in range B.
Code:
Sub Sample4() Dim A As Range Dim B As Range Set A = Application.InputBox("Select Data", "Sample Macro", Type:=8) Set B = A End Sub
Step 5: Now we will delete the data which has blank cells from the range chosen by the user.
Code:
Sub Sample4() Dim A As Range Dim B As Range Set A = Application.InputBox("Select Data", "Sample Macro", Type:=8) Set B = A A.SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub
Step 6: Now run the code from the run button provided.
Step 6: An input box appears.
Step 7: Select the range from A1:D8 in this example. Press OK to see the result.
The data which had blank cells have been deleted.
Things to Remember
There are a few things we need to remember about Delete Row in Excel VBA:
- We can delete the row based on a single cell.
- We can delete multiple rows by giving a range of cells.
- We can also delete rows by taking inputs from the user.
Recommended Articles
This has been a guide to VBA Delete Row. Here we discussed how to Delete Row in Excel VBA along with practical examples and downloadable excel template. You can also go through our other suggested articles –
- VBA Replace
- VBA Month
- VBA Case
- VBA IsError