Excel VBA: 如果A列单元格为空,则删除整行(长数据集)

9

我正在尝试删除一个长数据集(Excel中超过60,000行)中所有列A中有空白单元格的行。

我有一段VBA代码,在单元格少于约32,000个时可以很好地工作:

   Sub DelBlankRows()

   Columns("A:A").Select
   Selection.SpecialCells(xlCellTypeBlanks).Select
   Selection.EntireRow.Delete

   End Sub

有没有办法让它适用于大量行?谢谢。

它删除整个工作表。 - user1783504
1
我刚用 Excel 可以容纳的满行数据进行了操作,没有出现错误。但是我已经不再使用选择(select)语句了,就像这样:Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete - Joe Laviano
子程序是否无法正常工作是因为它删除了整个工作表,还是有其他实际问题?速度问题? - user2140173
3
在使用Excel 2007及之前版本的VBA中,SpecialCells存在一个显著缺陷,即无法处理超过8192个区域。请参见Ron De Bruin在此处的评论。如果你发现所有行都被删除了,那么这很可能是你遇到的问题。 - brettdj
1个回答

14

你可以尝试:

Application.ScreenUpdating = False
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Application.ScreenUpdating = True

Application.ScreenUpdating可以切换代码所做的更新是否对用户可见,并且尝试使用Columns("A:A").SpecialCells(...可能会节省时间,因为它实际上不需要选择单元格-未经测试。


我尝试了这段代码,对于小数字它是有效的。但我无法找出问题所在。如果我用随机文本和一些空格填充列A进行测试,它可以正常工作。但当我使用完整的数据表时,它就不行了。 - user1783504
正如mehow所说:你所说的“不起作用”是指什么?是需要很长时间才能完成,还是出现了错误信息? - ForkandBeard
实际上,它会删除整个工作表。很抱歉没有表达清楚。 - user1783504
@user1783504,我刚刚用20万行随机数据进行了测试,它运行得很好。如果你最终没有数据,那么我认为你的“完整数据表”在第一列中没有任何值。 - ForkandBeard
1
+1 是一种高效的方法,自动筛选是另一种方法。但是在使用 SpecialCells 时,始终要使用错误处理 - brettdj
这个宏对我来说失效了。我更改了它,使某个工作表处于活动状态,并删除列C中为空的行。这很有效,但有一种情况它会失败,那就是当我没有任何列C为空的行时。然后,宏将在以“Columns”开头的那一行失败。Worksheets("Master").Activate Application.ScreenUpdating = False Columns("C:C").SpecialCells(xlCellTypeBlanks).EntireRow.Delete Application.ScreenUpdating = True - Mannix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接