EntireRow.Delete性能问题

我试图删除空白值的所有行。 我有大约15,000行,不超过25%是空白的。 这是我的代码。

Columns("A:A").Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete 

第一行和第二行的代码工作正常,但是,当我尝试添加第三行我的电子表格超时,我留下了(不响应)消息。 我想我的问题是我想要一次删除的行数,因为代码在减less内容量时起作用。 任何人都可以build议一个修复 为什么不能擅长处理呢?

这需要这么长时间的原因是SpecialCells(xlCellTypeBlanks)的大量不连续范围,

更好的方法是在删除之前对数据进行sorting,因此只有一个连续的范围被删除

然后,您可以在删除后恢复原始的sorting顺序,如下所示:

 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 

我的testing(大约15000行,每隔4行)将时间从20秒缩短到〜150ms

您的代码正在电子表格的所有行上运行; 在使用的行上运行会更快。

像这样的东西:

 Range("A1", Cells(Sheet1.Rows.Count, 1).End(xlUp).Address).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 

或者,您可以对数据范围进行sorting – 将所有空白组合在一起…