有没有更有效的方法来执行以下操作,将一行中的三个单元格值添加到上面的相应单元格,然后删除旧行?一半时间宏冻结;我在大约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
答案 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