12

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

下面的脚本执行除了删除部分之外的所有操作,这会提示以下错误:

运行时错误 1004 -“范围类的删除方法失败”

我使用了以下代码:

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

7 回答 7

12

好问题!没有桌子,.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
于 2012-10-20T10:04:03.293 回答
2

您实际上可以一次性完成,但需要使用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
于 2012-10-20T14:03:56.223 回答
1

第 1 步:在表格中创建一个帮助列,您可以在其中检查该行中的任何空白字段。例如,如果您的表中有 3 列:A(价格)、B(数量)和 C(成本),您将添加第四列 D 并将其标记为“任何空白?”。方程将是=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

这实质上是使用帮助列过滤到要在表中删除的行,选择表中的所有可见数据,然后取消过滤表。我正在寻找如何删除表中所有可见行并找到了这个并摆弄,直到我发现这会起作用。将其与辅助列结合以选择所有带有任何空白的行似乎也是您想要的。

于 2015-05-01T17:57:43.387 回答
1

这个 One 班轮也有帮助

on error resume next '如果在 table .Range("Table1").Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 中没有找到空行,则继续执行宏

'这使用第一列作为检查空白的参考删除空'为表格使用自定义名称以便于代码中的操作

于 2020-06-03T01:16:25.320 回答
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
于 2016-12-22T01:40:51.927 回答
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
于 2018-08-30T13:26:21.707 回答
0

关于 Frej Lindstrom 的解决方案的两个注意事项,我使用过但不得不稍作调整:

(1) 在 Next 之前添加一个 End If

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

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

大警告:如果你的最后一行是空白的,这会给你一个死循环。不过,我可能会放入一个 IF 来处理它。

我知道这是一个旧线程,但我想我会添加这个,以防其他人通过寻找类似的解决方案。感谢 Frej - 你的代码真的很有帮助!

于 2019-09-23T21:54:28.847 回答