Excel VBA - 删除表中的空行

问题描述 投票:12回答:5

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

下面的脚本执行除删除部分以外的所有操作,这会提示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
excel vba excel-vba
5个回答
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
投票

你实际上可以一次完成,但需要使用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

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

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


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

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
© www.soinside.com 2019 - 2024. All rights reserved.