将所有非空行移动到ws的顶部

时间:2015-10-09 15:07:55

标签: excel vba

我正在尝试将所有非空白行移到工作表的顶部(实际上是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.我的理论是它只复制每个子范围中的第一行但我不确定。任何解决这个问题的方法,或者另一个快速实现相同结果的更快的替代方案将非常受欢迎。

2 个答案:

答案 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