删除行的宏冻结了一半的时间

时间:2015-04-08 18:54:13

标签: excel vba excel-vba

有没有更有效的方法来执行以下操作,将一行中的三个单元格值添加到上面的相应单元格,然后删除旧行?一半时间宏冻结;我在大约12,000行上运行它(工作表上没有动态公式)。

Application.ScreenUpdating = False

For a = Lcell To 2 Step -1
   If Cells(a, 23).Value = Cells(a - 1, 23).Value Then
       Cells(a, 16).Value = Cells(a, 16).Value + Cells(a - 1, 16).Value
       Cells(a, 17).Value = Cells(a, 17).Value + Cells(a - 1, 17).Value
       Cells(a, 18).Value = Cells(a, 18).Value + Cells(a - 1, 18).Value
       Cells(a - 1, 1).EntireRow.Delete
   End If
Next a

Application.ScreenUpdating = True

2 个答案:

答案 0 :(得分:0)

根据史蒂夫马丁的建议,试试这个:

For a = Lcell To 2 Step -1
   If Cells(a, 23).Value = Cells(a - 1, 23).Value Then
       Cells(a-1, 16).Value = Cells(a, 16).Value + Cells(a - 1, 16).Value
       Cells(a-1, 17).Value = Cells(a, 17).Value + Cells(a - 1, 17).Value
       Cells(a-1, 18).Value = Cells(a, 18).Value + Cells(a - 1, 18).Value
       Cells(a, 1).EntireRow.Delete
   End If
Next a

答案 1 :(得分:0)

删除单元格时的一个选项是使用UNION-DELETE模式。这将保存删除步骤,直到确定逻辑并立即完成所有操作。此技术允许删除正在迭代的Range。它还减少了应该提高增加速度的操作。我没有测试它的速度。

根据评论编辑删除最后一行的代码

Dim rng_delete As Range

For A = Lcell To 2 Step -1
   If Cells(A, 23).Value = Cells(A - 1, 23).Value Then
       Cells(A - 1, 16).Value = Cells(A, 16).Value + Cells(A - 1, 16).Value
       Cells(A - 1, 17).Value = Cells(A, 17).Value + Cells(A - 1, 17).Value
       Cells(A - 1, 18).Value = Cells(A, 18).Value + Cells(A - 1, 18).Value

        'rng_delete starts empty which errors Union on first add
        If rng_delete Is Nothing Then
            Set rng_delete = Cells(A, 1).EntireRow
        Else
            Set rng_delete = Union(rng_delete, Cells(A, 1).EntireRow)
        End If
   End If
Next A

rng_delete.Delete