【问题标题】:Column/Row operations (insert, delete) are very slow in Excel 2010Excel 2010 中的列/行操作(插入、删除)非常慢
【发布时间】:2011-03-22 16:07:58
【问题描述】:


我为 Excel 2003 编写的 VBA 宏遇到了很大的问题。它从其他文件导入一些数据。结果是 Excel 文件的文件大小(行数/列数)随着每个导入的文件而增加。在 Excel 2003 中,前 50 个导入文件的运行速度非常快,然后速度变慢。但是对于 Excel 2010,即使是少量文件也需要相当长的时间。问题在于一条语句执行了很多次:

Sheets("Sheetname").Rows(LastRow).Insert Shift:=xlDown

当文件变大时,此行在 Excel 2010 中需要将近一秒钟。当我手动添加行时,我遇到了同样的问题。

我通常会做很多事情来提高性能:

Application.ScreenUpdating = False  
Application.DisplayStatusBar = False  
Application.Calculation = xlCalculationManual  
Application.EnableEvents = False  
ActiveSheet.DisplayPageBreaks = False  
ActiveSheet.AutoFilterMode = False

提前感谢您的帮助。我很确定其他人已经遇到过这个问题。

【问题讨论】:

  • 你能找到不使用该行插入的方法吗?您如何添加新信息?
  • LastRow 真的是最后一行吗?如果是这样,为什么插入而不是复制?
  • 之所以使用插入,是因为将上一行的格式复制到了新插入的行中。但我想我会只是填写数据而不关心格式。

标签: performance vba excel insert row


【解决方案1】:

问题是我应用了条件格式。对于添加到报告中的每一行,都会创建一个新的条件格式规则,以便为每一行的一列中的单元格着色(例如,格式规则是“如果当前行的 A 列中的单元格包含 '启用',然后使单元格变为绿色")。
在 Excel 2003 中,如果 Application.Calculation 设置为手动或条件格式的处理方式不同(我不知道),则似乎不会重新计算条件格式。
知道这一点后,我为必须着色的整个列手动创建了条件格式规则,并删除了代码以从电子表格中为单个单元格着色。现在,事情在 Excel 2010 中运行得很快。
我想知道是否有可能提交错误报告(如果 Application.Calculation 设置为手动,则禁用条件格式重新计算)。

【讨论】:

  • 无论您是否使用条件格式,都应该有一个很好的例程,如果这确实是唯一的选择,它将为您插入一行。您应该更改问题,因为无法从该问题中获得此解决方案。您真正需要的是一种在执行每次插入后防止公式调整的方法。
【解决方案2】:

使用 Insert 很慢,因为它会迫使 Excel 做很多工作。将大量数据直接从变体写入工作表要快得多。
如果您想在底部保留一些公式(例如总计),则将公式块复制到变体中,将数据写入工作表,调整公式,然后在最后将其写回会更快。
如果您有其他公式引用添加数据的工作表,您可以使用动态范围名称来引用数据,或使用普通范围名称来引用总公式。

【讨论】:

  • 感谢您的提示,我将在底部添加数据(参见 cmets)。
  • 但问题仍然是为什么在 Excel 2010 中插入变得如此缓慢。它在 2003 年完美运行。我有一个相关的问题,我删除了行并且它是一样的。
  • 可能是因为行数和列数增加:插入和删除意味着搜索所有公式,以便调整引用。
  • 但工作表几乎不包含公式,而且 Office 2003 中的文件也不小。
  • 我告诉你的公式并不完全正确(见我上面的回答)
【解决方案3】:

聚会有点晚了,但首先导入所有数据,然后为范围添加格式/条件格式,而不是为每条记录添加新的条件格式。

【讨论】:

    【解决方案4】:

    如果我们有条件格式,使用插入会减慢处理速度。所以这里有2个选项。 一种是在运行插入代码之前删除条件格式。下面的代码片段会有所帮助

    Cells.SpecialCells(xlCellTypeAllFormatConditions).FormatConditions.Delete
    

    第二个选项不是在循环中一一插入行,而是获取需要插入的行数,然后在一行中执行,这将大大减少单次执行的时间。 Blow code sn-p 将对此有所帮助

    ActiveCell.EntireRow.Offset(1).Resize(rowCount).Insert Shift:=xlDown
    

    其中 rowCount 是要插入的行数。

    【讨论】:

      【解决方案5】:

      很奇怪....插入一行很快。然后,我对一系列行进行了排序,它变得异常缓慢。我把UsedRange后面的那行删了,又好了!

      【讨论】:

      • 欢迎来到 Stack Overflow!这实际上是评论,而不是答案。有了更多的代表,您将能够发布 cmets。你应该删除这个“答案”。
      猜你喜欢
      • 2013-11-01
      • 2015-03-04
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多