改进循环以更快地删除excel中的行

改进循环以更快地删除excel中的行,excel,delete-row,vba,Excel,Delete Row,Vba,如果BD列中的值为零,我创建了一个循环来删除行。循环可能需要半小时。我看到过使用自动过滤器或创建变体数组以加快功能的建议。如果您能为我下面的代码提供更好的解决方案,请告诉我 Const colBD As Long = 56 Dim IRow As Long Dim LstRow As Long LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row IRow = 3 'loop to delete rows w

如果BD列中的值为零,我创建了一个循环来删除行。循环可能需要半小时。我看到过使用自动过滤器或创建变体数组以加快功能的建议。如果您能为我下面的代码提供更好的解决方案,请告诉我

Const colBD As Long = 56
Dim IRow     As Long
Dim LstRow  As Long


LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

'loop to delete rows with zero in colBD
Do While IRow <= LstRow
    If Cells(IRow, colBD) = 0 Then
        Cells(IRow, 1).EntireRow.Delete
        LstRow = LstRow - 1             ' one less row
    Else
        IRow = IRow + 1                     ' move to next row
    End If
Loop
Const colBD的长度=56
暗淡无光
一排一排的
LstRow=ActiveSheet.Range(“A”&Rows.Count).End(xlUp).Row
IRow=3
'循环以删除colBD中为零的行

Do While IRow将要删除的所有行分配给一个范围,然后一次性删除该范围。这比逐个删除要快得多,并且可以防止错误

Const colBD As Long = 56
Dim IRow     As Long
Dim LstRow  As Long
Dim DelRng As Range

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

'loop to delete rows with zero in colBD
Do While IRow <= LstRow
    If Cells(IRow, colBD) = 0 Then
        If DelRng Is Nothing Then
            Set DelRng = Cells(IRow, 1)
        Else
            Set DelRng = Union(DelRng, Cells(IRow, 1))
        End If
    Else
        IRow = IRow + 1                     ' move to next row
    End If
Loop

If Not DelRng Is Nothing Then DelRng.EntireRow.Delete
Const colBD的长度=56
暗淡无光
一排一排的
暗德尔恩As范围
LstRow=ActiveSheet.Range(“A”&Rows.Count).End(xlUp).Row
IRow=3
'循环以删除colBD中为零的行

Do While IRow将要删除的所有行分配给一个范围,然后一次性删除该范围。这比逐个删除要快得多,并且可以防止错误

Const colBD As Long = 56
Dim IRow     As Long
Dim LstRow  As Long
Dim DelRng As Range

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

'loop to delete rows with zero in colBD
Do While IRow <= LstRow
    If Cells(IRow, colBD) = 0 Then
        If DelRng Is Nothing Then
            Set DelRng = Cells(IRow, 1)
        Else
            Set DelRng = Union(DelRng, Cells(IRow, 1))
        End If
    Else
        IRow = IRow + 1                     ' move to next row
    End If
Loop

If Not DelRng Is Nothing Then DelRng.EntireRow.Delete
Const colBD的长度=56
暗淡无光
一排一排的
暗德尔恩As范围
LstRow=ActiveSheet.Range(“A”&Rows.Count).End(xlUp).Row
IRow=3
'循环以删除colBD中为零的行

当IRow以上评论正确时,最好立即删除所有评论,但是如果循环,最好从结尾开始,然后返回。很容易陷入无休止的循环

Const colBD As Long = 56
Dim IRow As Long
Dim LstRow As Long
Dim i As Integer

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

'Always start with the last row and work towards the first when deleting rows
For i= LstRow to IRow Step - 1
    If Cells(i, colBD) = 0 Then
        Cells(i, 1).EntireRow.Delete
    End If
End Sub

上面的评论是正确的,最好一次删除所有内容,但是如果循环,最好从末尾开始,然后再返回。很容易陷入无休止的循环

Const colBD As Long = 56
Dim IRow As Long
Dim LstRow As Long
Dim i As Integer

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

'Always start with the last row and work towards the first when deleting rows
For i= LstRow to IRow Step - 1
    If Cells(i, colBD) = 0 Then
        Cells(i, 1).EntireRow.Delete
    End If
End Sub

我会先筛选
0
,然后删除所有可见行:

Const colBD As Long = 56
Dim IRow As Long
Dim LstRow As Long

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

ActiveSheet.Range("A1:BD1").AutoFilter Field:=colBD, Criteria1:="0"
Range("BD" & IRow & ":BD" & LstRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete

我会先筛选
0
,然后删除所有可见行:

Const colBD As Long = 56
Dim IRow As Long
Dim LstRow As Long

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
IRow = 3

ActiveSheet.Range("A1:BD1").AutoFilter Field:=colBD, Criteria1:="0"
Range("BD" & IRow & ":BD" & LstRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete

最快的方法是先选择所有行,然后使用
Range.delete
立即删除它们。这是最耗时的删除操作。只需添加到John Wu的答案中,您的范围可能是非连续的,因此您可能需要创建一个非连续的范围。在循环之前还需要使用
Application.ScreenUpdate=False
(不要忘了在循环结束后将其重新打开)最快的方法是先选择所有行,然后使用
Range.delete
立即删除它们。这是最耗时的删除操作。只需添加到John Wu的答案中,您的范围可能是非连续的,因此您可能需要创建一个非连续的范围。在循环之前还需要使用
Application.ScreenUpdate=False
(不要忘了在循环结束后将其重新打开)