0

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

先说一点背景资料:

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

Do-Until 循环将每行中的 D 列值与下面一行的值进行比较。如果值相同,则删除该行。我还在 A 列中使用了一个特殊的行编号公式,所以每当有删除时,子将公式从当前行复制到下面的行,因为删除会弄乱公式中的引用。循环继续,直到它到达一个空行。

目前,工作表有近 500 行,所以数据很多,但不是很多,对吧?sub 是在 Office 2003 中创建的,位于 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 培训的人那里得到一些反馈。

编辑添加:好的,我删除了循环的复制和粘贴部分,这似乎大大加快了速度。那么,有没有人知道为什么 sub 的特定部分会产生问题?

4

1 回答 1

5

在我的脑海中(没有任何测试),看起来你正在进入最后一行,然后无休止地循环,因为 IsEmpty(ActiveCell) 永远不会返回 true。

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

正如@HeadofCatering 所说,减少到一小部分数据并逐步执行代码,你会发现它

于 2012-06-02T08:17:13.730 回答