这需要这么长时间的原因是大量的非连续范围SpecialCells(xlCellTypeBlanks)
更好的方法是在删除前对数据进行排序,这样只删除一个连续的范围
然后,您可以在删除后恢复原始排序顺序,如下所示:
Sub Demo()
Dim rng As Range
Dim rSortCol As Range
Dim rDataCol As Range
Dim i As Long
Dim BlockSize As Long
Dim sh As Worksheet
Dim TempCol As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Set sh = ActiveSheet
Set rng = sh.UsedRange
With rng
' Add a temporary column to hold a index to restore original sort
TempCol = .Column + .Columns.Count
Set rSortCol = .Columns(TempCol)
rSortCol.Cells(1, 1) = 1
rSortCol.Cells(1, 1).AutoFill rSortCol, xlFillSeries
Set rng = rng.Resize(, rng.Columns.Count + 1)
Set rDataCol = rng.Columns(1)
' sort on data column, so blanks get grouped together
With sh.Sort
.SortFields.Clear
.SortFields.Add Key:=rDataCol, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange rng
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' delete blanks (allow for possibility there are no blanks)
On Error Resume Next
Set rng = rDataCol.SpecialCells(xlCellTypeBlanks)
If Err.Number <> 0 Then
' no blank cells
Err.Clear
Else
rng.EntireRow.Delete
End If
On Error GoTo 0
' Restore original sort order
With sh.Sort
.SortFields.Clear
.SortFields.Add Key:=rSortCol, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange rng
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
' Delete temp column
sh.Columns(TempCol).EntireColumn.Delete
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
我的测试(约 15000 行,每 4 行空白)将时间从约 20 秒减少到约 150 毫秒