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

Excel VBA - Range.Copy Increasing filesize and causing slowdowns

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

我正在制作一个电子表格,用于跟踪员工的病假天数,其布局为行是员工姓名,列是一年中的每一天。

我正在开发一个宏,可以将数据向后移动一个月,从而允许输入新数据。我现在的操作顺序是复制数据(第2个月到上个月)向左移动一个月,然后清除上个月的数据。这个 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

"Undo" 子程序:

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

问题是每次代码 运行 时,文件变大,代码变慢 运行。据我所知,这种 Range.Copy 不需要 "Application.CutCopyMode=False" 标志,而且当我使用它时它似乎没有任何区别。

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

是否有更好的方法来实现我的结果,因为现在似乎有一些隐藏的数据作为代码执行的结果堆积在我看不到的地方。

感谢我从这个 post 的答案中获得的所有帮助以及对我正在处理的电子表格的一些额外分析,我相信我已经找到了一种方法来实现预期的结果而不会降低速度和我遇到的文件大小增加。我认为将我的结果 post 放在这里是个好主意,以防其他人遇到同样的问题。

导致速度变慢和文件大小增加的根本问题不是代码本身,而是电子表格本身的布局方式,就像@Absinthe 所建议的那样。日历的数据输入部分中有条件格式规则,可以在周末、假期等日期中着色。我面临的问题源于原始 post 中的初始代码正在复制所有内容,包括条件格式规则返回 31 个单元格。

由于看起来复制命令覆盖了第一个月的数据,我认为删除该月的内容是多余的,但是条件格式规则每次都只是堆叠在一起代码是 运行。这会导致滚雪球效应,因为在开始的几个月中条件格式规则的数量会呈指数增长。这并没有让我觉得是个问题,因为我并不完全了解格式化规则是如何工作的,并且假设它们绑定到一个单元格并且不会被复制命令复制。

为了解决这个问题,我使用了 sheets.range.value=sheets.range.valuesheets.range.copy sheets.range.paste special xlPasteComments 的组合来生成以下代码。 (C1到C8是日历的角点,如原文所附照片所示post)

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 循环似乎通过在代码 运行ning 时不更新屏幕来加速代码。

我确定这是非常草率的代码,但在其当前形式中,它仅复制值和注释,同时保持条件格式规则不变。我已经 运行 测试子例程几十次,执行时间和文件大小与 运行 运行.

相比没有显着变化