Excel vba运行时间过长,但使用步入没有问题

Fra*_*cis 0 excel vba excel-vba

我有一些代码删除重复的行,同时保持第一个实例出现特定的字符串.

当我进入代码删除重复项时,宏运行顺利.但是,一旦我点击运行宏,我的excel会冻结并停止响应.我不太确定为什么......

如果有人能够解决一些问题.非常感谢.(我还添加了一个断裂线来显示我试图跑到哪里).

Sub CleanUp()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim lastRow As Integer
Dim i As Integer, j As Integer, k As Integer
Dim stakedItem As String
Dim sortCell As Range, allCell As Range, sortcell2 As Range
Dim currentItem As String, baseItem As String

lastRow = Sheet2.Range("A" & Sheet2.Rows.Count).End(xlUp).Row
Set sortCell = Sheet2.Range("A1")
Set sortcell2 = Sheet2.Range("B1")
Set allCell = Sheet2.Range("A1:Z" & lastRow + 1)
baseItem = Sheet2.Range("B2")

allCell.Sort key1:=sortcell2, order1:=xlAscending, Header:=xlYes

For i = 3 To lastRow
    currentItem = Sheet2.Range("B" & i)
    If currentItem = baseItem Then
        Sheet2.Rows(i).Delete
        i = i - 1
        lastRow = lastRow - 1
    Else
        baseItem = Sheet2.Range("B" & i)
    End If
Next i

Breakline here...


allCell.AutoFilter field:=2, Criteria1:=Array("*G*", "*HUB*"), Operator:=xlFilterValues

allCell.Sort key1:=sortCell, order1:=xlAscending, Header:=xlYes

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic


End Sub
Run Code Online (Sandbox Code Playgroud)

谢谢!

弗朗西斯

Com*_*ern 6

如果找到要删除的行,它将永远不会退出.原因是在For循环中,当该行代码求值时,退出条件是固定的.这意味着lastRow将永远是您进入循环时的状态.

此代码说明:

Sub example()
    Dim x As Long, i As Long
    x = 5
    For i = 1 To x
        Debug.Print i  'This runs 5 times...
        x = 1          '...even though you change x here.
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

所以,唯一lastRow = lastRow - 1能做的就是减少变量.删除第一行后,您可以保证在表格末尾删除currentItem = BaseItem.在这种情况下,你减少循环计数器,这给你一个无限循环.

正如@TimWilliams在评论中提到的那样,如果要删除行,则应该向后循环.像这样的东西:

For i = lastRow To 3 Step -1
    currentItem = Sheet2.Range("B" & i)
    If currentItem = BaseItem Then
        Sheet2.Rows(i).Delete
    Else
        BaseItem = Sheet2.Range("B" & i)
    End If
Next i
Run Code Online (Sandbox Code Playgroud)

  • 更好的是建立一个要删除的行范围,并一次删除它们. (3认同)