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

Excel VBA-删除空行,直到有数据为止,excel,vba,Excel,Vba,我有一个数据,看起来像这样,空行的数量可能会增加或减少,并且不是固定的 我想做的是把它变成这个,删除空行,直到有数据并使其停止。我不希望它删除可能位于数据中间的其他空行。 我一直在测试一些东西,这就是我所拥有的,但是这段代码并没有清除所有的空行,只有少数空行。我意识到问题可能是以rng的方式为每个单元格使用,因为当我使用cell.entirerow.delete时,它将继续到下一个单元格,但我可能错了 Sub Test() Dim cell as range, rng as rang

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

我想做的是把它变成这个,删除空行,直到有数据并使其停止。我不希望它删除可能位于数据中间的其他空行。

我一直在测试一些东西,这就是我所拥有的,但是这段代码并没有清除所有的空行,只有少数空行。我意识到问题可能是以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

感谢您的帮助

跟随我的评论,重新减少您的
for
循环。如果您执行以下操作,它应该会起作用:

选项显式
子测试()
暗我一样长,浅我一样长
将ws设置为工作表
设置ws=ThisWorkbook.Sheets(“Sheet1”)
lRow=ws.Range(“C”&ws.Rows.Count).End(xlUp).Row
对于i=L,请转至1步骤-1
如果ws.Cells(i,3).Value=”“和ws.Cells(i-1,3).Value=”“,则
ws.Cells(i,3).EntireRow.Delete
如果结束
接下来我
端接头

从底部开始,向上移动

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

你遇到了一个经典问题。挑战是,;如果删除第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行

根据您的评论,您有兴趣将空行保持在较低的位置。只有头和第一个数据之间的数据才需要删除。因此,您实际上对包含数据的第一个单元格感兴趣。此外,您可以一次删除一系列行,而不是逐个删除

请尝试以下操作:




这就完成了样本数据的工作。

删除行时,应减少循环的
。这将确保删除所有行。对每个
使用
,将确保增加,因此不会删除所有。您计划如何区分要保留的空行和要删除的空行?您只想删除标题和第一行数据之间的空行吗?您好,JvdV,是的,我只想删除标题和第一行数据之间的行。您好,通过运行代码,只剩下每个数据块的第一行,实际上我只想删除标题和第一行数据之间的行。剩下的空行应该保留在那里。我已经编辑了前面的代码以匹配您的描述。解决方案是计算第1行下面有多少空行,然后删除。嗨,通过运行代码,每个数据块只剩下第一行,实际上我想要的只是删除标题和第一行数据之间的行。剩下的空行应该保留在那里。您好,这是可行的,起初我认为有错误,但这只是因为工作表引用。非常感谢。很高兴它对你有用。工作表参考由
CodeName
提供。否则,您可能需要使用
工作表(“Sheet1”).Range(“A:A”)
@Vbanoob
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