我正在尝试运行一个宏来选择表格列中的空白单元格并删除整行。
下面的脚本执行除了删除部分之外的所有操作,这会提示以下错误:
运行时错误 1004 -“范围类的删除方法失败”
我使用了以下代码:
Sub test()
Range("Table1[[New]]").Activate
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireRow.Delete
End Sub
好问题!没有桌子,.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
您实际上可以一次性完成,但需要使用ListObject
对象及其DataBodyRange
和ListColumns
属性:
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 步:在表格中创建一个帮助列,您可以在其中检查该行中的任何空白字段。例如,如果您的表中有 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
这实质上是使用帮助列过滤到要在表中删除的行,选择表中的所有可见数据,然后取消过滤表。我正在寻找如何删除表中所有可见行并找到了这个并摆弄,直到我发现这会起作用。将其与辅助列结合以选择所有带有任何空白的行似乎也是您想要的。
这个 One 班轮也有帮助
on error resume next '如果在 table .Range("Table1").Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 中没有找到空行,则继续执行宏
'这使用第一列作为检查空白的参考删除空'为表格使用自定义名称以便于代码中的操作
调整以前的答案:
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
在 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
关于 Frej Lindstrom 的解决方案的两个注意事项,我使用过但不得不稍作调整:
(1) 在 Next 之前添加一个 End If
(2) 在 End If 之前添加“i = i - 1”
Why?
因为如果你有一个彼此上方的空白行,你会跳过一个,因为所有行的数字都只是向上移动了一个。本质上,如果您删除row [N]
了 ,则现在是另一行row [N]
,您还需要对其进行测试,而不是立即移至row [N + 1]
.
大警告:如果你的最后一行是空白的,这会给你一个死循环。不过,我可能会放入一个 IF 来处理它。
我知道这是一个旧线程,但我想我会添加这个,以防其他人通过寻找类似的解决方案。感谢 Frej - 你的代码真的很有帮助!