Excel VBA-Range.Copy增加文件大小并导致速度降低

时间:2019-03-19 18:26:32

标签: excel vba range move

从标题看,我的问题听起来很明显,但是请听我说。

我正在处理一个电子表格,该电子表格可跟踪员工的病假,其布局以行为员工姓名,列为一年中的每一天。

我正在处理一个宏,该宏将数据后退一个月,以便输入新数据。我当前的操作顺序是将数据复制(从第二个月到上个月)并将其向左移动一个月,然后在最后一个月清除数据。 photo可能会更好地解释它。

由于这种布局,我正在移动大约50行乘330列的数据数组。到目前为止,我一直在明智地使用以下代码和功能,它可以按预期工作:

(C1至C8是日历的拐角点,如图所示)

主子程序:

'Copying entire calender into undo tab for the undo subroutine to use
Sheets(1).Range(C1 & ":" & C8).Copy Sheets(5).Range(C1)

'Moving the "moving zone" months 31 cells to the left
Sheets(1).Range(C2 & ":" & C8).Copy Sheets(1).Range(C1)

'Clearing the last month to make room for new information
Sheets(1).Range(C3 & ":" & C8).ClearContents
Sheets(1).Range(C3 & ":" & C8).ClearComments

“撤消”子例程:

'Copies information from undo tab back into sheet 1
Sheets(5).Range(C1 & ":" & C8).Copy Sheets(1).Range(C1)

问题是每次运行代码时,文件大小都会变大,代码运行速度会变慢。据我所知,这种Range.Copy不需要“ Application.CutCopyMode = False”标志,无论如何我似乎都没有用。

我使用复印功能而不是剪切功能的原因是因为我想在日历的最右边保留格式(边框,颜色等)不变。

是否会有更好的方法来实现我的结果,因为目前看来,由于代码执行的结果导致一些隐藏的数据堆积在我看不见的地方。

1 个答案:

答案 0 :(得分:0)

感谢我从本文的答案中获得的所有帮助,以及对我正在处理的电子表格的一些额外分析,我相信我找到了一种在不降低速度和不增加文件大小的情况下实现预期结果的方法。体验。我认为最好将结果发布在这里,以防其他人遇到相同的问题。

导致速度减慢和文件大小增加的根本原因不是代码本身,而是电子表格本身的布局方式,如@Absinthe建议的那样。日历的数据输入部分中有条件格式设置规则,用于在周末,节假日等日期上色。我面临的问题源于以下事实:原始帖子中的初始代码正在复制包括条件格式设置规则在内的所有内容31个单元格。

由于看起来复制命令在第一个月覆盖了数据,所以我认为删除该月的内容将是多余的,但是条件格式化规则只是在每次代码被叠加时才相互叠加跑。这导致滚雪球效应,因为开始几个月中条件格式化规则的数量将成倍增加。这并不是我遇到的问题,因为我还不完全了解格式设置规则的工作原理,并且假定格式设置规则已绑定到单元格,并且不会被复制命令复制。

为解决此问题,我使用了sheets.range.value=sheets.range.valuesheets.range.copy sheets.range.paste special xlPasteComments的组合来产生以下代码。 (C1至C8是日历的角点,如原始帖子所附的照片所示)

With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With

'Copying entire calender into undo tab for the undo subroutine to use
Sheets(4).Range(C1 & ":" & C8).ClearContents
Sheets(4).Range(C1 & ":" & C8).ClearComments
Sheets(4).Range(C1 & ":" & C8).Value = Sheets(1).Range(C1 & ":" & C8).Value
Sheets(1).Range(C1 & ":" & C8).Copy
Sheets(4).Range(C1).PasteSpecial xlPasteComments
Application.CutCopyMode = False

'Moving the "moving zone" months 31 cells to the left
Sheets(1).Range(C1 & ":" & C6).ClearContents
Sheets(1).Range(C1 & ":" & C6).ClearComments
Sheets(1).Range(C2 & ":" & C8).Copy
Sheets(1).Range(C1).PasteSpecial xlPasteValues
Sheets(1).Range(C2 & ":" & C8).Copy
Sheets(1).Range(C1).PasteSpecial xlPasteComments
Application.CutCopyMode = False

'Clearing the last month to make room for new information
Sheets(1).Range(C3 & ":" & C8).ClearContents
Sheets(1).Range(C3 & ":" & C8).ClearComments

With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With

开始和结束处的with循环似乎可以通过在代码运行时不更新屏幕来加速代码。

我确定这是非常草率的代码,但以当前形式,它仅复制值和注释,而不会影响条件格式设置规则。我已经测试了运行该子例程数十次,并且每次运行的执行时间和文件大小都没有显着变化。