使用VBA删除Excel中的空行

10

我正在尝试使用以下代码删除空行:

worksheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

上述代码运行正常,但出现了运行时错误 '1004':未找到任何单元格。

5个回答

15
On Error Resume Next
worksheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
On Error GoTo 0

如果没有空单元格,错误处理很有帮助。当不存在这样的单元格时,SpecialCells(xlCellTypeBlanks)总是会返回一个错误,所以错误处理是(我所知道的)唯一的方法,如果你想使用 SpecialCells(xlCellTypeBlanks)


1
解释一下这些额外的行到底是做什么的会很有帮助 :-) - Enissay

8

您需要测试是否存在任何空白。

If WorksheetFunction.CountBlank(Worksheet.Columns("A:A")) > 0 Then
    Worksheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End If

您可以使用 On Error Resume Next 来跳过行,如果没有空白,但通常更好的做法是测试特定条件,而不是假设您知道错误将是什么。
就我所见,只有在 A 列中的每个单元格都有值时,您才会收到“未找到单元格”的消息。
编辑:根据 @brettdj 的评论,这里是一种仍然使用 CountBlank 的替代方法。
If WorksheetFunction.CountBlank(Intersect(worksheet.UsedRange, ws.Columns("A:A"))) > 0 Then
    worksheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End If

当然,UsedRange是出了名的易错且可能比实际范围大。我认为最好先确定要删除行的实际范围,然后在该范围内检查SpecialCells,例如:

Sub DeleteRows()
Dim ws As Excel.Worksheet
Dim LastRow As Long

Set ws = ActiveSheet
LastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
With ws.Range("A2:A" & LastRow)
    If WorksheetFunction.CountBlank(.Cells) > 0 Then
        .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End If
End With
End Sub

最后一点注意事项 - 我将变量从“worksheet”更改为“ws”,因为“worksheet”是Excel保留字。


Doug,那段代码对于OPs问题仍将失败,因为以上使用的CountBlank会查看A列中的每个单元格 - 所以这个条件几乎总是为真。而SpecialCells只查看usedrange,可能没有空单元格,也就是说_"据我所见,只有当A列的每个单元格都有值时,才会得到"No Cells Found"消息"_ 是不正确的。 - brettdj
brettdj,感谢您提供的信息。我曾经对OP在整个列上使用它的事实感到困惑,现在我明白了它是如何工作的。 - Doug Glancy
嗨,道格。SpecialCells 可以更直观地解释一下。 - brettdj

2

对我来说工作得很好。这些语句对我没有任何错误。

 Sheet1.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'perfect

我找到了以下解决方案来回答你的问题。
 On Error Resume Next
 Sheet1.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
 On Error GoTo 0

请看这些链接: http://www.excelforum.com/excel-programming/390329-microsoft-visual-basic-run-time-error-1004-no-cells-were-found.html http://www.mrexcel.com/forum/showthread.php?t=343744 还有,您设置了对象吗?在这里使用worksheet没有任何意义。
dim wsheet as worksheets
set wsheet = worksheets("worksheetname") or worksheets("sheet1")
wsheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

对于错误处理建议点赞。我同意“worksheet”不是最好的变量名。 - brettdj

1

另一种方式:

If Range("Table2").Rows.Count > 1 Then
   Range("Table2").EntireRow.Delete
End If

0
Sub delete_rows_blank()

t = 1
lastrow = ActiveSheet.UsedRange.Rows.Count
Do Until t = lastrow
If Cells(t, "A") = "" Then
Rows(t).Delete
End If
t = t + 1
Loop

End Sub

考虑添加更多内容以解释代码正在做什么。 - G42
抱歉 - 这个宏只是循环遍历"A"列中的空单元格,并删除该行。 (您可以调整lastrow或column letter以匹配您的需求)。希望这有所帮助! :) - user8608712

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接