【发布时间】:2023-03-24 05:41:01
【问题描述】:
我开发了一个宏来清理复制/粘贴的数据集,这些数据只是一系列行到具有多个列和标题的 Excel 中。为了帮助清理数据,我添加了三个 FOR LOOP 进程:
- 删除编号为项目符号的行
- 已删除无关数据(miles & minActive)
- 手动将其他数据集剪切/粘贴到各自的列中(steps & stepavg)
它似乎运作良好,但我想优化这个过程。在运行宏时,问题是我使用“UsedRange”来确定 FOR LOOP 1 存在多少行(大约 800 行)。在该循环期间,许多行被删除,因此它可能会从 800 过滤到 350。然后当执行 FOR LOOP 2 时,似乎 UsedRange 仍然引用 800 行,所以循环继续,从 350 过滤到 65。最后使用 FOR LOOP 3,它成功地完成了所有 65 个任务,我可以说它完成了。但是,它会继续排到第 800 行!
有什么建议可以“清除”或“重置”UsedRange 以加快此过程吗?除了这个问题,我的宏效果很好。
'Cleaning the Data
Dim i As Long
Dim j As Long
Dim k As Long
Dim maxRow As Long
maxRow = ActiveSheet.UsedRange.Rows.Count
'Removes all those single number rows
For i = 2 To maxRow Step 3
Rows(i).Select
Selection.Delete Shift:=xlLeft
Next i
Range("A1").Select
'Removes all those miles and min active data
Dim maxRow2 As Long
maxRow2 = ActiveSheet.UsedRange.Rows.Count
For j = 5 To maxRow2 Step 3
Range(Rows(j), Rows(j + 5)).Select
Selection.Delete Shift:=x1Up
Next j
Range("A1").Select
'Cut/paste the Steps and StepsAvg data
Dim maxRow3 As Long
maxRow3 = ActiveSheet.UsedRange.Rows.Count
For k = 3 To maxRow Step 1
Cells(k, 1).Select
Selection.Cut
Cells(k - 1, 2).Select
ActiveSheet.Paste
Cells(k + 1, 1).Select
Selection.Cut
Cells(k - 1, 3).Select
ActiveSheet.Paste
Range(Rows(k), Rows(k + 1)).Select
Selection.Delete Shift:=x1Up
Next k
【问题讨论】:
-
为了让它更快,首先要做的是avoid using select
-
谢谢,我已经开始改进代码了。您是否有替换“ActiveSheet.Paste”的建议? WAS:“范围(“A1:C1”)。选择...选择。剪切...范围(“B1”)。选择... ActiveSheet.Paste”尝试:“范围(“A1:C1”)。剪切... Range("B1").ActiveSheet.Paste" 但没有编译 有什么建议吗?
-
您只想要值,还是也粘贴格式?
-
对于初学者来说,.UsedRange 是不可靠的,有时是不可预测的。您是否没有一列总是将值降至 UsedRange 的底部?难道你没有类似标题行的东西,在 UsedRange 的末尾不会有任何空白吗?
-
在后面的代码中'删除所有那些单数行我不清楚你是否知道你正在删除你用来计数的行之一或不是。通常,在删除行时,您会从下往上进行操作,这样您就不会越过在删除行后被替换的行。