大家帮我看下这段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
展开
 我来答
sgk0
2013-05-29 · TA获得超过293个赞
知道小有建树答主
回答量:298
采纳率:0%
帮助的人:234万
展开全部
运行慢,是因为循环次数太多了

有这么几个改法
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)=""
判断两个连续空行
追问
也谢谢你这么费力帮我解答,谢谢了
百度网友ca64c0c
2013-05-29 · TA获得超过4664个赞
知道大有可为答主
回答量:2991
采纳率:61%
帮助的人:1453万
展开全部
似乎在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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一年孤独58aa
2013-05-29 · TA获得超过1404个赞
知道小有建树答主
回答量:592
采纳率:92%
帮助的人:436万
展开全部
是的,问题在于你这个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循环可能更好。
追问
也谢谢你这么费力帮我解答,谢谢了
追答
哈哈,我之前也遇到这个类似的问题,可把我郁闷坏了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式