excel 2010/2013 插入行非常慢

Posted

技术标签:

【中文标题】excel 2010/2013 插入行非常慢【英文标题】:excel 2010/2013 insert rows is very slow 【发布时间】:2013-11-01 20:55:48 【问题描述】:

我发现在表格结构或普通单元格中插入行 - 手动或其他方式 - 非常非常慢。就像在没有条件格式的表格中(仅包含文字字符串)或相邻单元格中插入 7 行需要 10 多分钟。

该工作簿有 45 个工作表和 20 个表格,其中较大的表格包含大约 10KB 的 XML 文件。有 33MB 的电子表格 XML,大多数约为 300KB,其中 5 个超过 1MB,一个为 15MB。它相当复杂但并不庞大。所有的计算都很好地从左到右从上到下,从右表到左表,我主要设法避免使用数组公式。所有表格都有规则的结构,计算的列只有一个公式。大多数表格列都是经过计算的,只有几个较小的列包含文字数据。

我在几张纸上确实有很多条件格式,但我一直非常小心地保持它的合理性并阻止它分裂:整张纸我有大约 45 条规则,这些规则被概括为涵盖所有列.格式化决策的主要处理被移到表格中作为辅助列,正如我所说,结构非常规则。

似乎这些类型的编辑不是线程安全的,因此只有一个处理器正在加载并且磁盘活动非常少。我无法理解excel一直在做什么。 当然,我将计算设置为手动...

我看到 cmets 将这种类型的事情归因于增加的行和列限制,但我不明白为什么这应该是一个因素。如果我查看电子表格的 XML 文件,就会发现只有被值或公式占据的行和列的代码。那么,为什么这些无人居住的牢房在起作用呢?

这对我的工作效率产生了巨大影响 - 尽管我在新发现的业余时间通过阅读此类网站学到了很多东西。我真的需要找出问题所在,以便尽可能避免或解决这个问题。

有人可以帮我吗?

以防万一人们对此感到疑惑,答案是在 Excel 中使用电源查询和电源视图。我发现中等(50 万行)数据集以及复杂的结构和转换都可以顺利进行。我不再在表格中使用公式。另一件事是,这自然会导致您获得强大的双功能。这就是我的建议。

【问题讨论】:

插入会导致隐式重写移位单元格中的所有公式以及依赖于移位单元格中任何数据的任何公式 - 我相信。我假设计算链用于确定在插入/删除时可能需要重写哪些单元格,但它可能只是对整个工作簿的直接扫描。 是否只在表的末尾插入(如果需要,进行排序)对性能有任何影响吗? 但为什么要“转移”空白空间?对于都是常规结构的表引用,该怎么办?如果您更改表内的内容,甚至更改行数,它不应影响通过常规结构的任何引用。 =tablename[@[列名]] 例如。此引用独立于表内容甚至行数。所以是:=Index(tablename[column name], 同样的:match(ref1,tablename[column name 2],0))... 需要做什么?我不明白... 不,先生,重新调整表格大小以在末尾添加行同样令人痛苦……这似乎无关紧要。 是的,这些都不需要重写 - 但 Excel 无需每次都查看就知道吗?对于这么大的工作簿,它几乎不会缓存依赖链。然而,表格的总数和表格的内部定义确实需要更改。您是逐个插入,还是只插入一个块? 【参考方案1】:

插入时间过长可能是因为 INDEX(或其他函数)引用了整列或整行。

我有一个非常相似的问题:不太复杂的工作表(大约 2500 行,有 15 列数据(查询结果),大约 10 列公式用于从查询结果中提取数据。当我插入一列时,第一列可能会在 4 秒左右插入,但第二列插入需要一分钟以上。哎呀!我在互联网上搜索,找到了这个网站 http://support.microsoft.com/kb/2755145。

我的经验:

我在我的工作表中使用了像 =INDEX(11:11,1,MATCH(AC$5,$10:$10,0)) 这样的公式,大约 25000 次。您可以看到每个公式两次引用一整行。显然,当我添加一列时,由于每一行都受到影响,因此我的每个公式都受到影响,Excel 会尽职尽责地努力弄清楚该怎么做。

根据我从微软网站学到的知识,我将公式更改为 =INDEX(QueryResults,ROW()-ROW(QueryHeaders),MATCH(AC$5,QueryHeaders,0)),其中 QueryResults 和 QueryHeaders 很简单命名范围。

在整个工作表中进行此更改后,插入一列几乎是瞬间完成的 - 不到一秒钟。

【讨论】:

谢谢 Chuck,不,我的公式中从来没有整列或整行。这不是我的问题。 这解决了我在一个非常重要的文档上的问题,该文档包含一个巨大的表格,其中包含许多对其他工作表的引用。谢谢!我花了很长时间才找到这个答案。【参考方案2】:

尝试删除条件格式,然后在主代码完成后使用 vba 重新应用它。为我工作。

【讨论】:

嗨,我仍然对此感兴趣,所以感谢您的建议。然而,我的问题不是 VBA 速度慢,而是 Excel 需要花费大量时间在表中插入列。自从我的原始帖子以来,我学到了很多东西,所以我现在知道为什么它只占用一个 CPU,并且 Excel 有一个主线程,但我仍然不明白 Excel 中的表格是否存在长期问题。关于 CF,这真的不是问题,因为当我删除它时,同样的行为仍然存在。而且我的 CF 非常干净,我确保它不会碎片化,并且我确保所有决策都在帮助列中 我也有类似的问题。添加数据时,我在顶部插入一行,因为数据大约是 4000 行乘 50 列。有时需要很长时间,有时只需要几秒钟。当您需要消除错误时,这非常令人沮丧。所有数学运算都在单独的工作表上完成,但该单独的工作表确实使用 INDEX 函数。 FWIW,Excel 已成为我的主要计算工具,因为 Mathcad 十五年前终止。对冗长的宏语言我还不是很了解,但是不了解也可以让它做很多工作。【参考方案3】:

这听起来像这里描述的问题http://fastexcel.wordpress.com/2012/01/30/excel-2010-tableslistobject-slow-update-and-how-to-bypass/

如果是这样,您必须打破其中一个条件才能绕过它: 要发生这种减速,必须满足以下每个条件:

A cell within the Table must be selected
The sheet containing the Table must be the Active Sheet
The cell being updated must be on the same sheet as the table, but does not have to be within the table
There must be a reasonable number of formulas in the workbook.

也许您可以在另一个工作表处于活动状态的情况下通过 VBA 间接进行更新。或者也许将所有公式移动到单独的工作簿会绕过它。 或者将您的表格转换回正常范围(如果需要,请使用动态范围名称)

【讨论】:

嗨,我尝试运行宏在目标工作表的列表对象中插入一行。根据活动单元格记下插入点后,宏会激活没有表格的工作表,然后在目标工作表中插入。从理论上讲,它会重新激活目标表,但我没有闲逛足够长的时间来找出答案。基本上会发生同样荒谬的行为,在一个非常简单的表中插入一行需要 10 多分钟。我认为表格在excel中坏了。它非常令人失望。 您能否确认如果您将表格改回范围,它会运行得很快? (否则您可能会发现不同的问题)。如果您确认我会尝试提交错误报告。 我只是测试了插入一行而不是更改一个值:表格和普通范围都很慢,所以你的情况与我的帖子中描述的不一样。也许您可以通过仅更改空行中的值而不是插入行来绕过。 我可以确认,如果我首先转换为范围,它仍然非常慢。关于你的第二点,我不明白你建议的解决方法查尔斯...... 插入一行时会出现问题。如果您只是在范围底部的空行中输入值,那么它不会很慢。但是,如果您使用的是 Tables,您还需要避免我的帖子中提到的问题。

以上是关于excel 2010/2013 插入行非常慢的主要内容,如果未能解决你的问题,请参考以下文章

插入数十万行时,MySQL 与 MS Access 相比非常慢

为啥使用 Dataflow 写入 Bigquery 非常慢?

在 MS SQL Server 中,将行插入表变量突然变得非常缓慢

UUID 作为主键(慢插入)

Excel宏比较两个工作表中的两列并插入行值

QAbstractItemModel:为啥在向模型中插入大量项目时发出 dataChanged 和插入行信号这么慢?