使用Excel VBA删除特殊types的空白单元格

这个脚本“工作”,但只有当我运行两次。 任何人都知道为什么发生这种情况? 处理特殊types已经有点噩梦,我不知道这只是我或已知的问题。 在Windows 7上使用Excel 2010我已经尝试了两次重复该代码也无济于事。 我试着把这个放在一个Do Until,并且总是在第一次执行的时候被困在一个永远的循环中。 我不知道为什么第二次执行它似乎工作

'Remove all Blank Cells On Error Resume Next For i = Cells.SpecialCells(xlCellTypeBlanks).Count To 1 Step -1 Cells.SpecialCells(xlCellTypeBlanks).EntireRow.Delete Next i If Cells.SpecialCells(xlCellTypeBlanks).Count = 0 Then ActiveWorkbook.Close (True) 

编辑 :更新的答案显示如何删除“specialcells”范围不重置工作表的UsedRange属性,以及如何可能导致问题。

尝试运行此子多次在工作表上有或没有调用Activesheet.UsedRange注释掉…

 Sub Tester() Dim rng As Range On Error Resume Next Set rng = ActiveSheet.Cells.SpecialCells(xlCellTypeBlanks) On Error GoTo 0 If Not rng Is Nothing Then Debug.Print "have empty cells" rng.EntireRow.Delete ActiveSheet.UsedRange Else Debug.Print "no empty cells" End If End Sub 

保存和重新打开似乎也重置UsedRange …

编辑2你应该非常小心使用这个! 即使该行中存在非空白单元格,也会删除整行。 对于某些types的数据布局可能会好,但对于其他types的则不行。 在某些情况下,您可能还会在调用“delete”时看到一个错误“不能在重叠select中使用该命令”。

我会告诉你说@ TimWilliams的答案更加优雅,但你可以试试这个:

 Sub Deletes() Dim rng As Range Set rng = ActiveSheet.UsedRange ' Check each cell in the range and if its value is empty, delete the row For Each Cell In rng If Cell.Value = "" Then Cell.EntireRow.Delete End If Next Cell ' Close ActiveWorkbook.Close End Sub