使用VBA删除Excel中的空行

时间:2011-10-24 13:28:51

标签: excel vba

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

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

上面的代码工作正常,但是给了run time error '1004': No Cells were found.

5 个答案:

答案 0 :(得分:14)

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

当没有空白单元格时,错误处理会有所帮助。如果没有像这样的单元格,SpecialCells(xlCellTypeBlanks)将始终返回错误,因此如果您想使用SpecialCells(xlCellTypeBlanks),错误处理是我知道的唯一方法(<}}。

答案 1 :(得分:7)

你需要测试是否有任何空白。

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

如果没有空格,你可以使用On Error Resume Next跳过该行,但通常最好测试一个特定条件,而不是假设你知道错误是什么。

据我所见,如果A列中的每个单元格都有值,则只会显示“No Cells Found”消息。

编辑:根据@ 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

最后一点 - 我将变量从“工作表”更改为“ws”,因为“工作表”是Excel保留字。

答案 2 :(得分: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

并且你是否设置了你的对象?工作表在这里没有任何意义

dim wsheet as worksheets
set wsheet = worksheets("worksheetname") or worksheets("sheet1")
wsheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

答案 3 :(得分:1)

另一种方式:

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

答案 4 :(得分: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