Excel VBA故障排除 – 当我运行这个子程序时,导致程序冻结的原因是什么?

我写了一个Excel VBA子程序,导致程序冻结。 我已经将问题隔离到子内部的Do-Until循环中。

先有一点背景资料:

我有两张表,我需要合并。 合并后,一些行将包含重复的数据。 重复的行在列D中具有相同的值。

“Do-Until”循环将每行中的列D值与下面一行中的值进行比较。 如果值相同,则该行被删除。 我也在列A中使用了一个特殊的行编号公式,所以无论何时出现删除,子公式都会将公式从当前行复制到下一行,因为删除会混淆公式中的引用。 循环继续,直到它到达一个空行。

目前,该表有近500行,所以它是很多的数据,但不是那么多,对吗? 该子是在Office 2003中创build的,并位于xls文件中。 我目前正在运行Office 2010,并以兼容模式处理文件。

无论如何,我已经复制下面的循环的代码。 有没有人有任何想法为什么循环可能会导致程序冻结? 提前致谢。

Do Until IsEmpty(ActiveCell) ' Define rows and cells Row1 = ActiveCell.row() RowPlus1 = ActiveCell.row() + 1 RowMinus1 = ActiveCell.row() - 1 Row1Student = "D" & Row1 RowPlus1Student = "D" & RowPlus1 Row1Number = "A" & Row1 RowMinus1Number = "A" & RowMinus1 If Val(Range(Row1Student)) = Val(Range(RowPlus1Student)) Then ActiveCell.EntireRow.Select Selection.Delete Shift:=xlUp Range(RowMinus1Number).Select Selection.Copy Range(Row1Number).Select Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveCell.Offset(-1, 0).Select End If ActiveCell.Offset(1, 0).Select Loop 

PS:我不是一个专业的程序员。 我教自己的VBA,所以我完全知道我的代码可能不是很干净。 这就是为什么我希望得到一些真正在VBA培训过的人的反馈。

编辑补充:好的,我删除了循环的复制和粘贴部分,这似乎大大加快了事情。 那么,有没有人有任何想法,为什么该子的特定部分造成了一个问题?

在我头顶(没有任何testing),它看起来像你到了最后一行,然后无休止地循环,因为IsEmpty(ActiveCell)永远不会返回true。

(你select最后一行,不能删除后面的那一行,但除了当前的ActiveCell之外无处可去。)

正如@HeadofCatering所说的那样,减less一小部分数据样本,然后遍历代码,就可以find它了