在Excel中启用WrapText时,运行ClearContents的性能非常慢
我在Excel 2007 VBA中debugging下面的代码,这看起来很简单。 由于某种原因,大约需要30分钟来处理900行数据。 我想我已经缩小到一些单元格格式,特别是WrapText选项。 有什么我在这里丢失,可以提高性能时删除这些行。
Sub ClearContentsOfActive() Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim NumLines NumLines = ActiveSheet.UsedRange.Rows.Count Range("2:" & NumLines + 3).Select Selection.ClearContents Selection.Delete Shift:=xlUp Application.EnableEvents = True Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
此外,用户在Excel 2003中没有遇到这些延迟,具有相同的代码。 提前致谢
更新
为了响应ClearContents行的冗余,这是在Excel 2003中工作的原始代码,这就是为什么我离开它。 评论这条线是我尝试的第一件事,因为我同意这可能是多余的。 请参阅下面的我的性能指标。
testing1
Selection.ClearContents ''// Takes ~30 mins Selection.Delete Shift:=xlUp ''// then this takes <1min
TEST2
'Selection.ClearContents '// If this line is commented Selection.Delete Shift:=xlUp ''// then this line takes ~30 mins
我相信它与WrapTextfunction有关的原因是因为当你清除WrapText行时,它会在行上执行AutoFit操作。 我认为隐藏屏幕更新或禁用事件会有所帮助。
调用.Delete之前实际上是否需要调用.ClearContents? 在我看来,对.ClearContents的调用是多余的。 您正在清空一系列单元格中的值,您只需将其从下一行中移除即可。
我不知道这是否会对性能问题有所帮助,但值得一试。
编辑:回应你的更新,如何避免select,只是做以下几点:
Range("2:" & NumLines + 3).Delete shift:=xlUp
你也可以尝试提前摆脱文字包装:
Range("2:" & NumLines + 3).WrapText = False Range("2:" & NumLines + 3).Delete shift:=xlUp
所以它似乎与单元格的ColorIndex属性有关,而不是WrapText特征。 该页面的macros有以下代码
For r = 0 to 1000 For c = 0 to 15 Sheets.Cells(r, c).ColorIndex = 14 Next c Next r
我build议用户使用ConditionalFormatting,将所有macros都一起closures,并解决他的性能问题。
条件格式是基于整个表格上的一个公式,如果以下评估为真,那么这个公式将变成黄色
=IF(ROW()>10, FALSE, LEN($A1)>0)