删除行不够快

时间:2017-07-03 18:10:34

标签: excel excel-vba vba

我在excel中有超过60000行我需要通过阅读F列来减少。我有一个功能宏但它需要永远。如果在列F中值为0或为null,我将删除行。我认为我的代码可能过于冗长。我在VBA很新。我在网上发现了这个代码,并试图将它变成我自己的代码。任何帮助是极大的赞赏。我的代码列在下面。

Private Sub CommandButton1_Click()
    Dim rng As Range
    Dim i As Long
    Set rng = ThisWorkbook.ActiveSheet.Range("F1:F62000")
    With rng
        For i = .Rows.Count To 1 Step -1
            If .Item(i) = "" Then
                .Item(i).EntireRow.Delete
            End If
            For i = .Rows.Count To 1 Step -1
                If .Item(i) = "0" Then
                  .Item(i).EntireRow.Delete
                End If
            Next i
    End With
End Sub

3 个答案:

答案 0 :(得分:2)

在循环中删除行是一个非常缓慢的过程。

这是一种更快的方法。这标识了需要删除的范围,然后一次删除它们。你还有很多不必要的代码我已经删除了。我没有测试下面的代码,但我认为它应该可行。

Private Sub CommandButton1_Click()
    Dim rng As Range, delRng As Range
    Dim i As Long

    With ThisWorkbook.ActiveSheet
        For i = 1 To 62000
            If .Range("F" & i).Value = "" Or .Range("F" & i).Value = "0" Then
                If delRng Is Nothing Then
                    Set delRng = .Range("F" & i)
                Else
                    Set delRng = Union(delRng, .Range("F" & i))
                End If
            End If
        Next i
    End With

    If Not delRng Is Nothing Then delRng.Delete
End Sub

注意:另一种更快的方法是使用.Autofilter

答案 1 :(得分:2)

为了应对列F同时包含数字和文字的可能性,您可以分两个阶段使用Autofilter:一个删除空白,另一个删除0

    With ThisWorkbook.ActiveSheet.Range("F1:F62000")
    .AutoFilter 1, ""
    .Offset(1).EntireRow.Delete
    .AutoFilter

    .AutoFilter 1, 0
    .Offset(1).EntireRow.Delete
    .AutoFilter
  End With

根据经验,这是按标准删除行的最快方法。但请注意,使用Autofilter需要第一行作为标题行。如果不是这样,请插入空行。

答案 2 :(得分:0)

尝试在代码前使用Application.ScreenUpdating = False,在代码后使用Application.ScreenUpdating = True

您的代码中有两个For i =。一个在另一个里面...... 只使用一个:

For i = .Rows.Count To 1 Step -1
    If .Item(i) = "" Or .Item(i) = "0" Then
       .Item(i).EntireRow.Delete
    End If
Next i