大家帮我看下这段EXCEL的VBA代码,怎么运行了了几个小时还在运行,,是不是进入了死循环,怎么修改好呢?
Sub【删除重复】()DimiAsLongFori=9690To16500IfCells(i,1)=Cells(i+1,1)AndCells(i,2)=Cells(i+1...
Sub 【删除重复】()
Dim i As Long
For i = 9690 To 16500
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) Then
Rows(i).Delete
i = i - 1
End If
Next i
End Sub 展开
Dim i As Long
For i = 9690 To 16500
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) Then
Rows(i).Delete
i = i - 1
End If
Next i
End Sub 展开
展开全部
运行慢,是因为循环次数太多了
有这么几个改法
1、减少excel操作过程,excel操作不像SQL那样快速,是非常占用内存的
比如说rows(i).delete这个方法
你改成cf=Union(cf, rows(i))
最后统一cf.delete
以免每次都执行一次delete
2、但你这个工作而言,什么都不需要,只要选中这两行,筛选里面有个“高级筛选”,“选择不重复记录”
PS,既然你写到16500行,说明你16500行内都要有数据,否则,空白行你是永远都删不干净的
一般我都是这么写
r=9690
do until cells(r,1)=""
代码
r=r+1
loop
这样运行到空行就停止了
如果你有个别的空行的话,就改成
do until cells(r,1)="" and cells(r+1)=""
判断两个连续空行
有这么几个改法
1、减少excel操作过程,excel操作不像SQL那样快速,是非常占用内存的
比如说rows(i).delete这个方法
你改成cf=Union(cf, rows(i))
最后统一cf.delete
以免每次都执行一次delete
2、但你这个工作而言,什么都不需要,只要选中这两行,筛选里面有个“高级筛选”,“选择不重复记录”
PS,既然你写到16500行,说明你16500行内都要有数据,否则,空白行你是永远都删不干净的
一般我都是这么写
r=9690
do until cells(r,1)=""
代码
r=r+1
loop
这样运行到空行就停止了
如果你有个别的空行的话,就改成
do until cells(r,1)="" and cells(r+1)=""
判断两个连续空行
追问
也谢谢你这么费力帮我解答,谢谢了
展开全部
似乎在16500行之前,当删除到空白行了以后,就会陷入死循环啊(空白行任意列的上下两行必定相等)……
所以IF语句要加一个条件:
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) And Cells(i,1) & Cells(i+1,1)>"" Then
所以IF语句要加一个条件:
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) And Cells(i,1) & Cells(i+1,1)>"" Then
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是的,问题在于你这个If条件和 i=i-1在一起导致如下问题:
如果cells(i,1)和cells(i,2)之后的行都为空,那么是满足你的条件的,然后i的值就一只+1再-1的循环下去。改为:
Dim i As Long
For i = 9690 To 16500
if Cells(i, 1) = “” And Cells(i, 2) = ““ then
exit sub
else
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) Then
Rows(i).Delete
i = i - 1
end if
End If
Next i
End Sub
注:ctrl+Pause停止运行。如果用do...loop循环可能更好。
如果cells(i,1)和cells(i,2)之后的行都为空,那么是满足你的条件的,然后i的值就一只+1再-1的循环下去。改为:
Dim i As Long
For i = 9690 To 16500
if Cells(i, 1) = “” And Cells(i, 2) = ““ then
exit sub
else
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) Then
Rows(i).Delete
i = i - 1
end if
End If
Next i
End Sub
注:ctrl+Pause停止运行。如果用do...loop循环可能更好。
追问
也谢谢你这么费力帮我解答,谢谢了
追答
哈哈,我之前也遇到这个类似的问题,可把我郁闷坏了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询