VBA宏很快删除行(VBA macro to delete rows quickly)

2019-07-21 11:20发布

我有几个真正的大的Excel数据文件,我需要去通过他们所有,并删除所有行,在塔T细胞的值是1。现在我的代码如下所示:

Sub test()
    Dim cell As Range

    For Each cell In Worksheets("Sheet1").Range("T5", "T900000")
        If cell.Value = 1 Then
            cell.EntireRow.Delete
        End If
    Next cell
End Sub

这似乎是工作,但需要永远跑,我不得不这样做一堆倍。 是否有这样做的更好的方法,或某种方式来优化我已经让它运行得更快?

Answer 1:

你认为当你为你遍历它们,你最终跳过行删除行这不工作...。 例如:想象你行具有数列A你看第一行1 ... 10,并决定将其删除。 你看看现在的第二排。 它具有数字3! 你从来没有看过第2行!

更好的方法是过滤你的标准列T中的电子表格,复制,粘贴我到一个新的工作表(包含格式等)。

您可以打开宏录制和手动做到这一点; 那么你将有确切的VBA代码。 我相信会快很多。

即使你不这样做,如果你想要做一个for each在那里你删除的东西,颠倒顺序(开始在后向前)



Answer 2:

如果你想使用一个循环,下面不应该跳过的项目。 我认为@Floris筛选方法可能会更快,虽然。

Sub Main()
    Dim Row As Long
    Dim Sheet As Worksheet
    Row = 5
    Set Sheet = Worksheets("Sheet1")
    Application.ScreenUpdating = False
    Do
        If Sheet.Cells(Row, 20).Value = 1 Then
            Sheet.Rows(Row).Delete xlShiftUp
        Else
            Row = Row + 1
        End If
    Loop While Row <= 900000
    Application.ScreenUpdating = True
End Sub

更新我已经切换Application.ScreenUpdating周围循环,这通常加速这样的东西了很多!



Answer 3:

如果您管理您的数据,如数据库,并希望删除特定行了出来,并有可能对其进行过滤,还有一招,以加快删除过程。 这是相对于简单的循环过程非常快:

我比较不同的例子的时间(以4806行)。

  • 标准循环缺失:2:25
  • 范围缺失:0:20
  • 筛选缺失:0:01

例如 :我在“Tabelle5”数据和要删除特定行。 该数据在第6行。每行1列,这与“老#”应该删除开始启动。

1)在此标准溶液(最长时间):

Dim i As Integer, counter As Integer
Dim strToRemove As String, strToRemoveRange As String
strToRemove = "OLD#"
strToRemoveRange = ""
counter = 0

With Tabelle5
    For i = .UsedRange.Rows.Count To 6 Step -1
        If Mid(.Cells(i, 1).value, 1, 4) = strToRemove Then
            .Rows(i).Delete Shift:=xlUp
        End If
    Next i
End With

2)在这里,范围溶液(中间时间):

Dim i As Integer, counter As Integer
Dim strToRemove As String, strToRemoveRange As String
strToRemove = "OLD#"
strToRemoveRange = ""
counter = 0

With Tabelle5
    For i = .UsedRange.Rows.Count To 6 Step -1
        If Mid(.Cells(i, 1).value, 1, 4) = strToRemove Then
            If strToRemoveRange = "" Then
                strToRemoveRange = CStr(i) & ":" & CStr(i)
            Else
                strToRemoveRange = strToRemoveRange & "," & CStr(i) & ":" & CStr(i)
            End If
            counter = counter + 1
        End If
        If counter Mod 25 = 0 Then
            If counter > 0 Then
                .Range(strToRemoveRange).Delete Shift:=xlUp
                strToRemoveRange = ""
                counter = 0
            End If
        End If
    Next i
    If Len(strToRemoveRange) > 0 Then
        '.Range(strToRemoveRange).Delete Shift:=xlUp
    End If
End With

3)过滤溶液(最短的时间):

Dim i As Integer, counter As Integer
Dim strToRemove As String, strToRemoveRange As String
strToRemove = "OLD#"
strToRemoveRange = ""
counter = 0

With Tabelle5
    For i = .UsedRange.Rows.Count To 6 Step -1
        If Mid(.Cells(i, 1).value, 1, 4) = strToRemove Then
            .Cells(i, 1).Interior.Color = RGB(0, 255, 0)
            counter = counter + 1
        End If
    Next i
    If counter > 0 Then
        .Rows("5:5").AutoFilter
        .AutoFilter.Sort.SortFields.Clear
        .AutoFilter.Sort.SortFields.Add( _
            Range("A5"), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 255, 0)
        .AutoFilter.Sort.Header = xlYes
        .AutoFilter.Sort.MatchCase = False
        .AutoFilter.Sort.Orientation = xlTopToBottom
        .AutoFilter.Sort.SortMethod = xlPinYin
        .AutoFilter.Sort.Apply
        .Rows("6:" & CStr(counter + 5)).Delete Shift:=xlUp
        .Rows("5:5").AutoFilter
    End If
End With

这里的绿线将责令其顶部和一系列绿色命中将被全部删除。 这是我知道的最快方法! :-)

我希望这会帮助别人!

最好的问候汤姆



Answer 4:

我发现的最快方法是清除行数据(.clear),然后排序。 例如,我想摆脱分页符,显示为“=========”

I=20
Do While i <= lRow3
    If Left(Trim(ws3.Cells(i, 1)), 1) = "=" Then
        ws3.Range(Rows(i - 7), Rows(i + 2)).Clear
        'i = i - 7
        'lRow3 = lRow3 - 10
    End If
    i = i + 1
Loop

现在排序然后做一个xlUp最后一行(ws3.Range( “A1000000”)。完(xlUp).Row)等。

删除行(在我的文件,这22万行左右一个。)需要3分钟。 清除下的内容物10秒需要。

那么问题就变成了如何“删除”的空行,如果您需要将数据从行下方移动到一个以上在此之前完成。 :)

干杯,BJ



文章来源: VBA macro to delete rows quickly