На SO много сообщений об удалении строк, некоторые хорошие, некоторые не очень хорошие.
Двумя наиболее распространенными из них являются автофильтр (который вы используете) и создание диапазона с помощью Union (с одним из которых Дэвид связал вас).
Для набора данных такого размера и такого количества удалений вы найдете любой метод, который использует ссылки на методы листа Excel (такие как автофильтр, поиск, сортировка, объединение, формулы и т. Д.)медленный. Некоторые из них будут лучше, чем другие, в зависимости от точной природы ваших данных.
Существует другой метод, который может работать для вас. То есть на самом деле не Удалить строк, а перезаписать данные измененной версией.
Обратите внимание, что это работает, только если у вас нет формул (ни на этом листе, нидругие), которые относятся к обрабатываемым данным.
Я запускал этот код на примере набора данных 500 тыс. строк, 20 столбцов случайных чисел 1..32 (т. е. около 25% или удаленных строк)
Это длилось ~ 10 с
Sub DeleteRows2()
Dim ws As Worksheet
Dim rng As Range
Dim i As Long, j As Long
Dim NewI As Long
Dim dat, NewDat
Dim TestCol As Long
Dim Threashold As Long
Dim LastRow As Long, LastCol As Long
Dim t1 As Single, t2 As Single
t1 = Timer()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
TestCol = 9
Threashold = 8
Set ws = Sheet1
With ws
Set rng = .Range(.Cells(.Rows.Count, 1).End(xlUp), .Cells(1, .Columns.Count).End(xlToLeft))
End With
dat = rng.Value2
ReDim NewDat(1 To UBound(dat, 1), 1 To UBound(dat, 2))
LastRow = UBound(dat, 1)
LastCol = UBound(dat, 2)
NewI = 0
For i = 1 To LastRow
If dat(i, TestCol) > Threashold Then
NewI = NewI + 1
For j = 1 To LastCol
NewDat(NewI, j) = dat(i, j)
Next
End If
Next
rng = NewDat
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
t2 = Timer()
MsgBox "deleted in " & t2 - t1 & "s"
End Sub