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)
谢谢!
弗朗西斯
如果找到要删除的行,它将永远不会退出.原因是在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)