我可以将数组写入范围并仅重新计算更改的单元格吗?

时间:2011-12-08 19:22:40

标签: excel vba excel-vba

我有一大堆数据正在写入范围。但是,有时只有少数几个元素会发生变化。我相信,因为我正在将整个数组写入范围,所以正在重新计算所有单元格。有没有办法有效地编写元素的子集 - 特别是那些已经改变的元素?

更新:我实际上是按照这种方法来节省写入时间:

http://www.dailydoseofexcel.com/archives/2006/12/04/writing-to-a-range-using-vba/

特别是,我有一个属性集合,我使用我需要的数据填充所有对象(它们是单元格)。然后,我遍历所有属性并将值写入数组,索引数组,使其与我要写入的范围的维度相匹配。最后,使用TheRange.Value = TempArray,我将数组中的数据写入她的工作表。最后一步覆盖了整个范围,我相信即使在实际值没有变化的单元格中也会导致重新计算。

1 个答案:

答案 0 :(得分:4)

让我先从几个基础知识开始:

  • 当您写入一系列单元格时,即使值相同,Excel仍会将其视为更改并相应地重新计算。如果关闭计算并不重要,那么下次计算范围/工作表/工作簿时,它将重新计算依赖于该范围的所有内容。
  • 正如您所发现的,将数组写入范围比逐个单元格编写快得多。将范围读入数组也比逐个读取单元格要快得多。

关于仅编写已更改数据子集的问题,您需要一种快速方法来识别哪些数据已更改。这可能是显而易见的,但需要考虑因为这种方法也需要一些时间。

要仅写入已更改的数据,您可以通过以下两种方式执行此操作:返回逐个单元格编写或将数组拆分为更小的块。知道其中任何一个是否比编写整个范围更快的唯一方法是尝试所有三种方法并将它们与您的数据计时。如果90%的数据被更改,写入整个块肯定比逐个单元写入更快。另一方面,如果改变的数据仅表示5%,则逐个单元可能更好。性能取决于太多变量,无法提供一个适合所有人的解决方案。