2

这个脚本“有效”,但前提是我运行它两次。任何人都知道为什么会这样?处理特殊类型有点像噩梦,我不确定这只是我的问题还是已知的问题。在 Windows 7 上使用 Excel 2010。我尝试重复代码两次也无济于事。我试着把它放在一个直到我第一次执行时总是卡在一个永远循环中。我不确定为什么第二次执行它似乎有效

'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)
4

2 回答 2

4

编辑:更新答案以显示删除“特殊单元格”范围如何不会重置工作表的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你应该非常小心地使用它!即使该行中有非空白单元格,它也会删除整行。对于某些类型的数据布局可以,但对于其他类型的数据布局则不行。在某些情况下,调用“删除”时,您可能还会看到错误“无法在重叠选择中使用该命令”。

于 2012-08-16T19:50:30.680 回答
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
于 2012-08-16T19:50:53.183 回答