我正在尝试将所有非空白行移到工作表的顶部(实际上是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行,由空行分隔,创建100个子范围,在函数结束后我只有100行(其他900行丢失)。
我注意到在这种情况下Ubound(a)
也返回100.我的理论是它只复制每个子范围中的第一行但我不确定。任何解决这个问题的方法,或者另一个快速实现相同结果的更快的替代方案将非常受欢迎。
答案 0 :(得分:1)
对其进行排序以查找空白不应影响其余行 - 它们应保持正确的顺序。但是,如果您最终对多个列进行排序,因为构成空行的内容更复杂,那么可能会发生这种情况。
此过程采用没有标题的范围。它添加了一个具有原始排序的列,对范围进行排序,删除空白,然后将范围重新调整回原始方式。
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
答案 1 :(得分:0)
正如ExcelHero所说,您可以从Excel中对行进行排序。但这会改变非空行的顺序。如果要删除空白行但保留数据顺序,可以应用此宏:
Sub removeEmptyRows()
Dim r As Range
For Each r In UsedRange.Rows
If Application.CountA(r) = 0 Then r.Delete
Next
End Sub