我有一个看起来像这样的数据,空行的数量可能会增加或减少,并且不是固定的。
我想要做的是将其转到此位置,以删除空行,直到有数据并使其停止为止。我不希望它删除可能在数据中间的其他空行。
我一直在测试某些东西,这就是我所拥有的,但是这段代码并不能清除所有空行,而只能清除其中的几行。我意识到问题可能是使用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
感谢您的帮助
答案 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
这将完成您的示例数据。