On large Datasets like this I prefer to use arrays instead of deleting rows. The concept is pretty simple you load your Target cell values into an array (Data) and then create a second empty array the same size (NewData). Next you loop through the Data and copy any rows of Data that you want to keep the next empty row in NewData. Finally you overwrite the Target cell values with the NewData, effectively deleting the rows that you didn't want to keep.
I actually went a step further here by adding a PreserveFormulas parameter. If PreserveFormulas = True then the formulas are copied to the NewData, instead of just the values.
Note: 59507 rows deleting every other row. I compare Array Delete Data Only, Array Delete Preserve Formulas, Union Method and Filter Method. Download Test Stub
Results

Test
Sub Test()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Sheet1").ListObjects("Table1")
Call deleteTableRowsBasedOnCriteria(tbl, "AH", "Del", False)
Debug.Print
Set tbl = ThisWorkbook.Worksheets("Sheet2").ListObjects("Table13")
Call deleteTableRowsBasedOnCriteria(tbl, "AH", "Del", True)
End Sub
Code
Sub deleteTableRowsBasedOnCriteria(tbl As ListObject, columnName As String, criteria As String, PreserveFormulas As Boolean)
Dim Start: Start = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim Data, Formulas, NewData
Dim col As Long, pos As Long, x As Long, y As Long
col = Columns(columnName).Column
Data = tbl.DataBodyRange.Value
If PreserveFormulas Then Formulas = tbl.DataBodyRange.Formula
ReDim NewData(1 To UBound(Data, 1), 1 To UBound(Data, 2))
For x = 1 To UBound(Data, 1)
If Data(x, col) <> criteria Then
pos = pos + 1
For y = 1 To UBound(Data, 2)
If PreserveFormulas Then
NewData(pos, y) = Formulas(x, y)
Else
NewData(pos, y) = Data(x, y)
End If
Next
End If
Next
tbl.DataBodyRange.Formula = NewData
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Debug.Print "Preserve Formulas: "; PreserveFormulas
Debug.Print "Original RowCount: "; UBound(Data, 1); " Column Count: "; UBound(Data, 2)
Debug.Print "New RowCount: "; pos
Debug.Print UBound(Data, 1) - pos; " Rows Deleted"
Debug.Print "Execution Time: "; Timer - Start; " Second(s)"
End Sub
.Rangewas obviously completely wrong. My next guess is ... does your table have a column labelled "AH"? Or is that the Excel column? (tbl.ListColumns(columnName)needs to havecolumnNamecontain the column name - e.g. "Column27" or "DelFlag" - whatever it is set up as in your table.) - YowE3K