Sub Delete_Rows()
Dim tableRangeAddress_IncludingHeaderRow As String
tableRangeAddress_IncludingHeaderRow = RangeSelectionPrompt("Select the entire table range (including header row)")
If tableRangeAddress_IncludingHeaderRow = "" Then Exit Sub
Dim header_Field_RowNumber As Long
header_Field_RowNumber = Range(tableRangeAddress_IncludingHeaderRow)(1, 1).Row
Dim firstDataRow As Long
firstDataRow = header_Field_RowNumber + 1
Dim lastColumnNumber As Integer
lastColumnNumber = Range(tableRangeAddress_IncludingHeaderRow)(1, Range(tableRangeAddress_IncludingHeaderRow).Columns.Count).Column
Dim lastDataRow As Long
lastDataRow = Range(tableRangeAddress_IncludingHeaderRow)(Range(tableRangeAddress_IncludingHeaderRow).Rows.Count, 1).Row
Dim tableRangeAddress_ExcludingHeaderRow As String
tableRangeAddress_ExcludingHeaderRow = _
Range(tableRangeAddress_IncludingHeaderRow)(2, 1).Address & ":" & _
Range(tableRangeAddress_IncludingHeaderRow)(Range(tableRangeAddress_IncludingHeaderRow).Rows.Count, _
Range(tableRangeAddress_IncludingHeaderRow).Columns.Count _
).Address
Dim rowAddressWithThe_1s As String
rowAddressWithThe_1s = Range(tableRangeAddress_IncludingHeaderRow).Rows(1).Offset(-1, 0).Address
Dim columnLetter_ToPutCriteriaColumnFormula As String
columnLetter_ToPutCriteriaColumnFormula = Split(Cells(1, lastColumnNumber + 1).Address, "$")(1)
Range(columnLetter_ToPutCriteriaColumnFormula & header_Field_RowNumber).Value = "Criteria"
Dim columnLetter_To_Retrieve_KeywordsFrom As String
columnLetter_To_Retrieve_KeywordsFrom = Split(Cells(1, lastColumnNumber + 2).Address, "$")(1)
Dim firstRowWithAKeyWord As Long
firstRowWithAKeyWord = Cells(1, columnLetter_To_Retrieve_KeywordsFrom).End(xlDown).Row
Dim lastRowWithAKeyWord As Long
lastRowWithAKeyWord = Cells(ActiveSheet.Rows.Count, columnLetter_To_Retrieve_KeywordsFrom).End(xlUp).Row
Dim columnLetter_Of_Criteria_Range As String
columnLetter_Of_Criteria_Range = Split(Cells(1, lastColumnNumber + 3).Address, "$")(1)
Range(columnLetter_Of_Criteria_Range & header_Field_RowNumber - 1).Value = "Criteria"
Range(columnLetter_Of_Criteria_Range & header_Field_RowNumber).Formula = "=" & Chr(34) & ">0" & Chr(34)
Dim criteriaRangeAddress As String
criteriaRangeAddress = columnLetter_Of_Criteria_Range & header_Field_RowNumber - 1 & ":" & columnLetter_Of_Criteria_Range & header_Field_RowNumber
Dim columnLetter_ToPutRowCounterFormula As String
columnLetter_ToPutRowCounterFormula = columnLetter_Of_Criteria_Range
With Range(columnLetter_ToPutCriteriaColumnFormula & firstDataRow & ":" & columnLetter_ToPutCriteriaColumnFormula & lastDataRow)
.Formula = "=SUM(IF(TRANSPOSE(ISNA(MATCH(" & "$" & columnLetter_To_Retrieve_KeywordsFrom & "$" & firstRowWithAKeyWord & ":" & "$" & columnLetter_To_Retrieve_KeywordsFrom & "$" & lastRowWithAKeyWord & ",INDEX(FILTER(IF(" & rowAddressWithThe_1s & "=1," & tableRangeAddress_ExcludingHeaderRow & "," & Chr(34) & Chr(34) & "),INDEX(IF(" & rowAddressWithThe_1s & "=1," & tableRangeAddress_ExcludingHeaderRow & "," & Chr(34) & Chr(34) & "),MATCH(" & columnLetter_ToPutRowCounterFormula & firstDataRow & "," & "$" & columnLetter_ToPutRowCounterFormula & "$" & firstDataRow & ":" & columnLetter_ToPutRowCounterFormula & "$" & lastDataRow & ",0),0)<>" & Chr(34) & Chr(34) & "),MATCH(" & columnLetter_ToPutRowCounterFormula & firstDataRow & "," & "$" & columnLetter_ToPutRowCounterFormula & "$" & firstDataRow & ":" & columnLetter_ToPutRowCounterFormula & "$" & lastDataRow & ",0),0),0)))=FALSE,1,0))"
.Replace What:="@", Replacement:="", LookAt:=xlPart, FormulaVersion:=xlReplaceFormula2
End With
Range(columnLetter_ToPutRowCounterFormula & firstDataRow & ":" & columnLetter_ToPutRowCounterFormula & lastDataRow).Formula = "=ROW()"
Dim firstColumnLetter_Of_OriginalTableAddress As String
firstColumnLetter_Of_OriginalTableAddress = Split(Range(tableRangeAddress_IncludingHeaderRow)(1, 1).Address, "$")(1)
tableRangeAddress_IncludingHeaderRow = firstColumnLetter_Of_OriginalTableAddress & header_Field_RowNumber & ":" & columnLetter_ToPutCriteriaColumnFormula & lastDataRow
Dim topLeft_CellAddress_ToPaste As String
topLeft_CellAddress_ToPaste = Range(Split(Cells(header_Field_RowNumber, lastColumnNumber + 5).Address, "$")(1) & header_Field_RowNumber).Address
Dim columnLetterOfPastedResult_Where_Criteria_Column_Is As String
columnLetterOfPastedResult_Where_Criteria_Column_Is = Split(Cells(header_Field_RowNumber, lastColumnNumber + Range(topLeft_CellAddress_ToPaste).Column).Address, "$")(1)
Range(topLeft_CellAddress_ToPaste & ":" & columnLetterOfPastedResult_Where_Criteria_Column_Is & lastDataRow).ClearContents
Range(tableRangeAddress_IncludingHeaderRow).AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=Range(criteriaRangeAddress), _
CopyToRange:=Range(topLeft_CellAddress_ToPaste), _
Unique:=False
Range(columnLetter_ToPutCriteriaColumnFormula & firstDataRow - 1 & ":" & columnLetter_ToPutCriteriaColumnFormula & lastDataRow).ClearContents
Range(columnLetter_ToPutRowCounterFormula & firstDataRow - 2 & ":" & columnLetter_ToPutRowCounterFormula & lastDataRow).ClearContents
Range(columnLetterOfPastedResult_Where_Criteria_Column_Is & firstDataRow - 1 & ":" & columnLetterOfPastedResult_Where_Criteria_Column_Is & lastDataRow).ClearContents
End Sub
Sub Test__RangeSelectionPrompt()
MsgBox RangeSelectionPrompt("Choose Cells")
End Sub
Function RangeSelectionPrompt(titleOfRangeSelectionPromptBox As String)
Dim Selectedarea As Range
On Error Resume Next
Set Selectedarea = Application.InputBox(prompt:="Left click on the top-left cell and drag to the botSomething-right cell.", _
Title:=titleOfRangeSelectionPromptBox, Default:=Selection.Address, Type:=8)
If Selectedarea Is Nothing Then
Selectedarea = ""
Exit Function
End If
RangeSelectionPrompt = Selectedarea.Address
End Function