2

我在 Excel 2007 VBA 中调试以下代码,这看起来很简单。由于某种原因,处理 900 行数据大约需要 30 分钟。我想我已经把它缩小到一些单元格格式,特别是 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 中工作的原始代码,这就是我离开它的原因。评论这条线是我尝试的第一件事,因为我同意它可能是多余的。有关我的伪性能指标,请参见下文。

测试1

Selection.ClearContents  ''//  Takes ~30 mins
Selection.Delete Shift:=xlUp  ''// then this takes <1min

测试2

'Selection.ClearContents  '// If this line is commented
Selection.Delete Shift:=xlUp  ''// then this line takes ~30 mins

我认为它与 WrapText 功能有关的原因是,当您清除它执行的 WrapText 行和行上的 AutoFit 操作时。我认为隐藏屏幕更新或禁用事件会有所帮助。

4

2 回答 2

1

在调用.Delete之前真的有必要调用.ClearContents吗?在我看来,对 .ClearContents 的调用是多余的。您正在清空一系列单元格中的值,您只需在下一行中将其从存在中删除。

我不知道这是否有助于解决性能问题,但值得一试。

编辑:响应您的更新,如何避免选择,只需执行以下操作:

Range("2:" & NumLines + 3).Delete shift:=xlUp

您还可以尝试提前摆脱文本换行:

Range("2:" & NumLines + 3).WrapText = False
Range("2:" & NumLines + 3).Delete shift:=xlUp
于 2009-03-24T18:14:45.367 回答
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)
于 2009-03-26T21:15:02.860 回答