2012-10-20 166 views
9

我试图运行一个宏来选择表列中的空白单元格并删除整行。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

不错的问题!没有桌子,.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

这是表的解决方案,但你应该在的情况下添加错误校验(按照Brettdj的回答)没有空行被发现 –

+1

好吧,我编辑的答案,并添加错误检查 – fthiella

+0

这工作完美。谢谢。 – user91240192094

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 
+0

该方法仍然给我100%的运行时错误:虽然略有不同,但表示“操作不被允许,操作尝试移动工作表上的表格中的单元格。”) – user91240192094

+0

是否有另一个表格我们正在谈论的一个?如果是这样,你应该考虑改变设计,不要把表格堆叠在一起。如果您在Excel中执行此操作,而不使用VBA,则希望您收到相同的消息。另外,如果是这样,请在桌子上尝试一下,其上面或下面没有其他表格。如果没有,我可能会难倒:)。 –

+0

嘿道格 - 只是工作表中的一张表。 – user91240192094

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 

这本质上屏蔽了要使用的辅助列在表中删除行,并选择表中的所有可见数据,并且不对表格进行过滤。我正在搜索如何删除表中的所有可见行,并发现这一点,并弄乱,直到我发现这会起作用。把它和一个辅助列结合起来,选择所有空白的行看起来也是你想要的。

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