我正在Excel 2007 VBA中调试以下代码,这看起来非常简单。出于某种原因,它需要大约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中工作的原始代码,这就是我离开它的原因。评论这条线是我尝试的第一件事,因为我同意这可能是多余的。请参阅下面的psuedo性能指标。
测试1
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
我认为它与WrapText功能有关的原因是因为当你清除WrapText行时它会对行执行和AutoFit操作。我认为隐藏屏幕更新或禁用事件会有所帮助。
答案 0 :(得分:1)
在调用.Delete之前是否真的需要调用.ClearContents?在我看来,对.ClearContents的调用是多余的。您将清空一小部分单元格中的值,这些单元格只是在下一行中删除。
我不知道这是否有助于解决性能问题,但值得一试。
编辑:为了响应您的更新,如何避免选择,并执行以下操作:
Range("2:" & NumLines + 3).Delete shift:=xlUp
你也可以尝试提前摆脱文本包装:
Range("2:" & NumLines + 3).WrapText = False
Range("2:" & NumLines + 3).Delete shift:=xlUp
答案 1 :(得分:1)
因此它似乎与单元格的ColorIndex属性有关,而与WrapText功能无关。该页面的宏具有以下代码
For r = 0 to 1000
For c = 0 to 15
Sheets.Cells(r, c).ColorIndex = 14
Next c
Next r
我建议用户使用ConditionalFormatting,将宏连接在一起,这样就解决了他的性能问题。
ConditionalFormatting基于整个工作表上的公式,如果以下评估为真,则该公式变为黄色
=IF(ROW()>10, FALSE, LEN($A1)>0)