【问题标题】:Delete empty rows on Column A in excel 2007在excel 2007中删除A列上的空行
【发布时间】:2012-03-30 07:55:18
【问题描述】:

我有以下代码从 A 列中获取空行,然后删除整行。我无法在 2010 年使用 Special--> Blanks --> Delete Sheet Rows 功能,因为 2007 年的上限约为 8000 个非连续行。这段代码在一些旧机器上非常慢,大约需要 40 分钟才能完成(但可以完成工作)。有没有更快的替代方案?

 Private Sub Del_rows()
    Dim r1 As Range, xlCalc As Long
    Dim i As Long, j As Long, arrShts As Variant
    With Application
        xlCalc = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With
    arrShts = VBA.Array("Sheet1")  'add additional sheets as required
    For i = 0 To UBound(arrShts)
        With Sheets(arrShts(i))
            For j = .UsedRange.Rows.Count To 2 Step -8000
                If j - 7999 < 2 Then
                    .Range("A2:A" & j).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
                Else
                    .Range("A" & j, "A" & j - 7999).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
                End If
            Next j
        End With
    Next i
    Application.Calculation = xlCalc

【问题讨论】:

    标签: excel vba excel-2007


    【解决方案1】:

    拉吉夫,试试这个。这应该很快。

    Option Explicit
    
    Sub Sample()
        Dim delrange As Range
        Dim LastRow As Long, i As Long
    
        With Sheets("Sheet1") '<~~ Change this to the relevant sheetname
            '~~> Get the last Row in Col A
            LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            For i = 1 To LastRow
                If Len(Trim(.Range("A" & i).Value)) = 0 Then
                    If delrange Is Nothing Then
                        Set delrange = .Rows(i)
                    Else
                        Set delrange = Union(delrange, .Rows(i))
                    End If
                End If
            Next i
    
            If Not delrange Is Nothing Then delrange.Delete
        End With
    End Sub
    

    编辑

    您还可以使用自动过滤器来删除行。这是相当快的。对于这么大的行,我没有测试这两个示例 :) 如果您遇到任何错误,请告诉我。

    Option Explicit
    
    Sub Sample()
        Dim lastrow As Long
        Dim Rng As Range
    
        With Sheets("Sheet1")
            lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            '~~> Remove any filters
            .AutoFilterMode = False
    
            With .Range("A1:A" & lastrow)
              .AutoFilter Field:=1, Criteria1:=""
              .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
            End With
    
            '~~> Remove any filters
            ActiveSheet.AutoFilterMode = False
        End With
    End Sub
    

    HTH

    席德

    【讨论】:

    • 我没有机会完全测试这个,但我从运行时来看,第一件看起来差不多。我一定会尽快尝试并报告我的发现。不过还是谢谢!!
    • 实际上,在大量行中,我发现问题中发布的代码比第一个建议快得多。我认为 AutoFilter 方法会更好地扩展,但这也可能会受到 Excel 2007 及更早版本的约 8000 个区域限制。
    【解决方案2】:

    此代码在 100,000 行中耗时不到一秒(如果需要,记录更完整代码的操作):

    Sub DeleteRows()
    
    Application.ScreenUpdating = False
    Columns(1).Insert xlToRight
    Columns(1).FillLeft
    Columns(1).Replace "*", 1
    Cells.Sort Cells(1, 1)
    Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Columns(1).Delete
    
    End Sub
    

    【讨论】:

    • 这适用于 Excel 2007 吗?我问是因为 2007 年限制为大约 8000 个非连续行。
    • 是的,这段代码应该适用于所有版本。它只是对工作表进行排序,以便可以在一个块中删除所有行。
    • 哇。这就像一个魅力!我将在我的电子表格中修改此代码,因为其中有一些自定义标签(不需要的文本),在我输入此代码之前我需要删除它们。
    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2022-12-09
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多