我正在尝试运行一个宏,在表列中选择空白单元格并删除整行。
下面的脚本会执行除删除部分以外的所有操作,这会提示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
答案 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
对象及其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
答案 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
'此删除为空,使用第一列作为检查空白的参考 “为表格使用自定义名称,以便在代码中轻松操作