此脚本“有效”,但仅限于我运行两次。任何人都知道为什么会这样?处理特殊类型一直是一个噩梦,我不确定这只是我或已知的问题。在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)
答案 0 :(得分:4)
编辑:更新了答案,说明删除“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 ...
EDIT2 你应该非常小心使用它!即使该行中存在非空白单元格,它也会删除整行 。某些类型的数据布局可以使用,但对其他类型的数据布局则不行。在某些情况下,当调用“delete”时,您可能还会看到错误“无法在重叠选择上使用该命令”。
答案 1 :(得分:0)
我想说@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