首页 > 解决方案 > 如果有 2 个连续的空行,则删除行

问题描述

我想要做的是删除行,如果有 2 个连续的空行,并且还要删除标题和第一组数据行之间的空行。这是我的原始 输入和我想要的是这个。我试图在这里和那里找到一些代码并想出这个代码。

Sub Testing()
    Dim i As Long , lRow As Long
    Dim ws As Worksheet

    Set ws = Activesheet
    With ws
        With .Range("C:C")
            fr = .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues).row
            If fr > 2 Then
                .Rows("2:" & fr - 1).EntireRow.Delete
            End If
        End With
        i = 1
        For i = 1 To lRow
            If IsEmpty(Cells(i, 3)) And IsEmpty(Cells(i + 1, 3)) Then
                .Rows(i).EntireRow.Delete
           End If
        Next i
    End With
End Sub

但是,数据集中间仍然有一些连续的空行。我知道那是因为我正在增加i它将查看下一个单元格,但我不知道如何解决它。我是 vba 的新手,甚至是 SO 发布的新手,所以如果我做错了什么,请告诉我,并感谢您的帮助。

标签: excelvba

解决方案


您唯一需要做的就是向后循环。代替

For i = 1 To lRow

For i = lRow To 1 Step -1

这是因为从底部循环对尚未处理的行的行计数没有任何影响,但从上到下循环会。

您也可以在它没有任何影响i = 1之前跳过它,因为从指定为下限的任何内容开始。ForFori

我认为您的代码只是一个示例,但以防万一注意lRow从未在您的代码中设置为值,因此是0.


请注意,在这一行

If IsEmpty(Cells(i, 3)) And IsEmpty(Cells(i + 1, 3)) Then

您的Cells对象没有被引用到With语句表,因为您在一开始就忘记了.。它应该是

If IsEmpty(.Cells(i, 3)) And IsEmpty(.Cells(i + 1, 3)) Then

此外,我强烈建议您使用Range.Find 方法

fr = .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues).row

始终LookAt参数指定为xlWholeor xlPart(请参阅XlLookAt)。因为该LookAt参数没有默认值(很遗憾),如果您没有指定它,VBA 将使用用户界面或 VBA最后xlWhole使用的任何一个或任何内容。因此,您无法知道以前使用过哪一个,它会变得非常随机(或者您的代码有时可能有效,有时无效)。xlPart


替代(更快)方法……</h3>

…是保持前向循环并收集所有要删除的行在一个变量RowsToDelete中,以便最终一次删除它们。它快得多,因为每个删除操作都需要时间,在这种方法中,您只有一个删除操作……而在另一种方法中,每行一个删除操作。

Dim RowsToDelete As Range
For i = 1 To lRow 'forward loop is no issue here because we just collect
    If IsEmpty(.Cells(i, 3)) And IsEmpty(.Cells(i + 1, 3)) Then
        If RowsToDelete Is Nothing Then 'first row
            Set RowsToDelete = .Rows(i).EntireRow
        Else 'append more rows with union
            Set RowsToDelete = Application.Union(RowsToDelete, .Rows(i).EntireRow)
        End If
   End If
Next i

'delete all collected rows (after the loop, so delete doesn't affect row counting of the loop)
If Not RowsToDelete Is Nothing Then
    RowsToDelete.Delete
End If


推荐阅读