在Excel中启用WrapText时,运行ClearContents的性能非常慢

时间:2009-03-24 17:50:07

标签: excel vba excel-2007

我正在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操作。我认为隐藏屏幕更新或禁用事件会有所帮助。

2 个答案:

答案 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)