VBA-删除空行,直到有数据

时间:2019-11-25 09:01:31

标签: excel vba

我有一个看起来像这样的数据,空行的数量可能会增加或减少,并且不是固定的。

enter image description here

我想要做的是将其转到此位置,以删除空行,直到有数据并使其停止为止。我不希望它删除可能在数据中间的其他空行。

enter image description here

我一直在测试某些东西,这就是我所拥有的,但是这段代码并不能清除所有空行,而只能清除其中的几行。我意识到问题可能是使用for each cell in rng的方式,因为当我使用cell.entirerow.delete时它将继续到下一个单元格,但是我可能是错的。

Sub Test()
    Dim cell as range, rng as range
    Dim lRow as long

    Set rng = Range("C3:C" & lRow)

    For Each cell In rng
        If IsEmpty(cell.Offset(-1)) Then
            cell.Offset(-1).EntireRow.Delete
        Else
            Exit For
        End If
    Next cell
End Sub

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

在我的评论之后,请减少您的For循环。如果您执行以下操作,则它应该可以工作:

Option Explicit

Sub Test()

    Dim i As Long, lRow As Long
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    lRow = ws.Range("C" & ws.Rows.Count).End(xlUp).Row

    For i = lRow To 1 Step -1
        If ws.Cells(i, 3).Value = "" And ws.Cells(i - 1, 3).Value = "" Then
            ws.Cells(i, 3).EntireRow.Delete
        End If
    Next i

End Sub

答案 1 :(得分:1)

从底部开始并进行操作。

Sub Button1_Click()
    Dim LstRw As Long, x

    LstRw = Cells(Rows.Count, "C").End(xlUp).Row

    For x = LstRw To 1 Step -1
        If IsEmpty(Cells(x, 2)) Then Cells(x, 2).EntireRow.Delete
    Next

End Sub

下面的简单代码在大多数实例中都可以使用

如果找不到空白,则需要错误陷阱

Sub delrws()
    On Error Resume Next
    Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

答案 2 :(得分:1)

您遇到的是经典问题。挑战是;如果删除第26行,则以前是27的行将是26。因此,下一个循环将跳过该行,并留下(可能)空白行。

一种解决此问题的方法是进行向后循环。我的解决方案是:

Sub Test()
    Dim lRow As Integer

    For i = 2 To 100
        If IsEmpty(Cells(i, 1)) Then
            lRow = i
        Else
            Exit For
        End If
    Next i

    For i = lRow To 2 Step -1
        If IsEmpty(Cells(i, 1)) Then
            Cells(i, 1).EntireRow.Delete
        End If
    Next i

End Sub

这解决了这个问题,因为如果删除第26行,则前一行27将变为第26行。但是此更改无关紧要,因为循环现在从下到上进行,这意味着下一个循环检查第25行。

答案 3 :(得分:1)

根据您的评论,您有兴趣将空行放在更下方。只需要标头和第一个数据之间的内容。因此,您实际上对包含数据的第一个单元格感兴趣。另外,您可以一次删除一系列行,而不必一次删除。

尝试以下操作:


Sub Test()

Dim fr As Long

With Sheet1.Range("A:A")
   fr = .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues).Row
   If fr > 2 Then
       .Rows("2:" & fr - 1).Delete
   End If
End With

End Sub

这将完成您的示例数据。