使用Excel VBA删除SpecialType空白单元格

时间:2012-08-16 19:32:37

标签: excel vba excel-vba

此脚本“有效”,但仅限于我运行两次。任何人都知道为什么会这样?处理特殊类型一直是一个噩梦,我不确定这只是我或已知的问题。在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)

2 个答案:

答案 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