将所有非空白行快速移动到ws顶部

我试图将所有非空白行移动到我的工作表顶部(实际上是一个自动Autofilter的顶部)。

我已经意识到,简单地删除空行是非常缓慢的,而且更快的替代方法是将范围分配给变体。

我已经拿出这个代码,但是由于某种原因,它正在失去一些行:

 Public Sub CompactRows(ByRef ws As Worksheet) Dim a As Variant With ws a = .AutoFilter.Range.Offset(1, 0).Columns(1).SpecialCells(xlCellTypeConstants).EntireRow .AutoFilter.Range.Offset(1, 0).Clear .AutoFilter.Range.Cells(2, 1).Resize(UBound(a), .UsedRange.Columns.Count) = a End With End Sub 

所以,如果我有1000行,以空行分隔,创build100个子范围,function结束后,我只有100行(其他900丢失)。

我注意到在这种情况下Ubound(a)也返回100.我的理论是它只复制每个子范围中的第一行,但我不确定。 任何解决这个问题,或另一个更快的替代scheme,以达到同样的结果,将不胜感激。

sortingfind空白不应该影响其余的行 – 他们应该保持正确的顺序。 但是,如果最终在多个列上进行sorting,因为构成空白行的内容更复杂,则可能会发生这种情况。

此过程需要一个没有标题的范围。 它添加一个原始sorting的列,对范围进行sorting,删除空白,然后将范围恢复到原来的方式。

 Public Sub CompactRows(ByRef rng As Range) Dim rNew As Range 'Put the row in a column so you can sort it 'back to the original way later With rng.Offset(, rng.Columns.Count).Resize(, 1) .Formula = "=ROW()" .Copy .PasteSpecial xlPasteValues End With 'Make a range that includes the sort column Set rNew = rng.Resize(, rng.Columns.Count + 1) 'Sort on the first column to get all the blanks together rNew.Sort rNew.Cells(1), xlAscending, , , , , , xlNo 'Assume a blank in column 1 is a blank row - delete them all in one shot rNew.Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'Resort the range on the sort column rNew.Sort rNew.Cells(rNew.Columns.Count), xlAscending, , , , , , xlNo 'Delete the sort column rNew.Cells(rNew.Columns.Count).EntireColumn.Delete End Sub 

正如ExcelHero所说,你可以对Excel中的行进行sorting。 但是这会改变非空行的顺序。 如果你想删除空白行,但保持你的数据的顺序,你可以应用这个macros:

 Sub removeEmptyRows() Dim r As Range For Each r In UsedRange.Rows If Application.CountA(r) = 0 Then r.Delete Next End Sub