Excel VBA - 删除表中的空行

时间:2012-10-20 08:00:05

标签: excel vba excel-vba

我正在尝试运行一个宏,在表列中选择空白单元格并删除整行。

下面的脚本会执行除删除部分以外的所有操作,这会提示run-time error 1004 - "Delete method of Range class failed"

任何想法如何解决这个问题?感谢

Sub test()
Range("Table1[[New]]").Activate
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireRow.Delete
End Sub

7 个答案:

答案 0 :(得分:11)

好问题!如果没有表格,.EntireRow.Delete总是有效,但在表格中它看起来却没有。

这有效:

Sub Test()
  Dim Rng As Range
  On Error Resume Next
  Set Rng = Range("Table1[[New]]").SpecialCells(xlCellTypeBlanks)
  On Error Goto 0
  If Not Rng Is Nothing Then
    Rng.Delete Shift:=xlUp
  End If
End Sub

答案 1 :(得分:1)

您实际上可以一次性完成,但需要使用ListObject对象及其DataBodyRangeListColumns属性:

Sub ClearBlankCellsInColumnNew()
Dim rngBlanks As Excel.Range

With Worksheets("Sheet1").ListObjects("Table1")
    On Error Resume Next
    Set rngBlanks = Intersect(.DataBodyRange, .ListColumns("New").Range).SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0
    If Not rngBlanks Is Nothing Then
        rngBlanks.Delete
    End If
End With
End Sub

答案 2 :(得分:1)

步骤1:在表格中创建一个帮助列,检查该行中的任何空白字段。例如,如果表中有3列:A(价格),B(数量)和C(成本),您可以添加第四列D并标记它" Any Blanks?"。等式为=IF(OR(ISBLANK([@Price]),ISBLANK([@Quantity]),ISBLANK([@Cost])),"Yes","No")

这将为您提供一个过滤列以查看所有空白。

步骤2:在VBA中,您将执行以下操作:

Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column, Criteria1:="Yes"
Application.DisplayAlerts = False
Range("MyTableNameHere").ListObject.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column

这实际上是使用帮助列过滤到要在表中删除的行,选择表中的所有可见数据,并对表进行过滤。我正在搜索如何删除表中的所有可见行并找到它并摆弄,直到我发现这将起作用。将其与帮助列组合以选择具有任何空白的所有行似乎也是您想要的。

答案 3 :(得分:0)

调整以前的答案:

On Error Resume Next
Set Rng = ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not Rng Is Nothing Then
Rng.Delete Shift:=xlUp
End If

答案 4 :(得分:0)

在Excel中使用ListObjects可以轻松使用以下内容删除空白行。

Sub RemoveBlankRow(ByVal SheetName As String, TableName As String)
Dim rng As Integer

rng = Sheets(SheetName).ListObjects(TableName).DataBodyRange.Rows.Count

For i = 1 To rng
    If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).EntireRow.Delete
Next
End Sub

答案 5 :(得分:0)

关于Frej Lindstrom解决方案的两点说明,我曾用过,但要稍作调整:

  

(1)在下一个之前添加结束符

     

(2)在End If之前添加“ i = i-1”

Why?,因为如果空白行彼此重叠,则由于所有行的数字都只向上移动了一个,因此您将跳过其中的一行。本质上,如果您删除了row [N],则另一行现在是row [N],并且您还需要对其进行测试,而不是立即移至row [N + 1]

大提示:如果最后一行为空白,则会出现循环。我可能会放入一个IF来处理它。

我知道这是一个旧线程,但是我想在其他人通过寻找类似解决方案的情况下添加它。谢谢Frej-您的代码确实有所帮助!

答案 6 :(得分:0)

这一个班轮也有帮助

错误恢复下一个'如果表中未找到空行则继续执行宏 .Range(“ Table1”)。Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

'此删除为空,使用第一列作为检查空白的参考 “为表格使用自定义名称,以便在代码中轻松操作