编辑CountIf公式为部分固定范围时的Excel计算错误

我一直在处理一个大的数据集,遇到了一个看起来很奇怪的Excel错误。

我已经将问题隔离到一个CountIf公式,并且有一个部分固定的范围,用于检查一个项目是否在上面的愤怒中重复。例如=COUNTIF(C$7:C17,C17) / =COUNTIF(C$7:C18,C18)复制完整的数据集。

当复制到大量的行(比如说10,000)时,公式粘贴和计算正确,这是当你尝试和其他任何事情发生错误时。 例如,如果您尝试删除/清除全部/复制并粘贴所有单元格的值,则单元格进度条会出现并慢慢地移动,以实现简单的过程。

如果您在整个范围内使用了CountIf,清除单元格的值几乎是瞬间的。 SumIf对于相同的部分范围也立即删除。

您应该能够通过对10k行使用=RANDBETWEEN(0,10000)复制这个,复制并粘贴随机数的值以将它们隔离为问题并应用部分范围countif与全范围countif,然后select部分范围单元格,并删除。 请注意,如果将计算设置为手动,则问题仍然存在。

作为参考,我在Windows 7 64位上使用Excel 2013 64位。

如果有人正在确认错误或知道现有的错误和潜在的解决scheme,将不胜感激。

编辑:重现问题的步骤

  1. 创build一个新文件(保存并退出其他Excel文件!)
  2. 要创build要计数的数据,在A2中,如果CPU速度较慢,请input= RANDBETWEEN(0,10000),如果CPU速度较快,则inputRANDBETWEEN(0,20000)
  3. 将A2复制到行A10k或A20k。
  4. 复制并粘贴列A的值
  5. 在B2中,input= COUNTIF($ A $ 1:A2,A2)并复制下来
  6. 完整计算完工作表后,selectB列中的所有CountIf单元格,然后使用“全部清除”function。 这是Excel似乎为我10分钟(有一个i7处理器)冻结2分钟的阶段。 如果是即时的,那么让我知道你使用的是什么版本的Excel和窗口。

Byron怀疑Excel更新依赖树会花费时间。

如果通过将Workbook.ForceFullCalculation设置为true来closures依赖关系树维护,那么清除20000 COUNTIF单元几乎是即时的。

请注意,使用此选项会使每个计算都进行完整计算:每个公式都变得不稳定,状态栏始终显示计算结果。

编辑:

继查尔斯的优秀答案,这迫使表中的所有公式都是会话中的易变的,我以为我会尝试重新生成一个易失性偏移函数的CountIf来定义范围,并确定它的工作。 所以我使用的公式是: =COUNTIF(OFFSET(A2,-ROW(A2)+2,0):A2,A2)

是否最好有一个非易失性函数,你需要打开ForceFullCalculation来改变(删除,过去的值等)与拥有大量的易失性公式将取决于你。

原文:

好的,所以我一直在尝试一些其他的公式,看看我能否克服这个问题。

奇怪的是,使用=SUMIF($A$1:A2,A2,$A$1:A2)/A2偶尔会工作,立即清除B列中的所有数据,但是不一致,并且经常会像=COUNTIF($A$1:A2,A2)公式中使用的原始post。

我也尝试了一些其他的公式,比如=SUMPRODUCT($A$1:A2*($A$1:A2=A2))/A2 ,以及在数组公式中使用Sum的相同configuration,但从来没有立即清除。

我也尝试复制空白单元格,并将其张贴在公式单元格上,但仍然冻结了相同的30至60年代清除它们。 你可以剪切和粘贴,这将是很好,但试图清除会导致冻结。 删除整个列也没有加快这个过程。 我也在安全模式下testingExcel,无济于事。

鉴于缺乏成功,我猜测,由于每个公式的不同范围,Byron对Excel更新内部模型后的内部模型的评论正在导致冻结 – 虽然我仍然不明白为什么粘贴公式第一个实例将花费一小部分时间来清除/删除它们!

因此,我只能得出结论,不pipe原因如何,似乎没有一个公式化的解决scheme,不会导致冻结,所以我将不得不使用数据透视表/删除重复项。

我很欣赏那些试图复制这个问题的人 – 无论它值多less钱,看起来好像有3个使用有问题,1个没有。

这是由于使用RANDBETWEEN函数造成的。 我无法复制您的结果后,我使用静态数据代替100万行这个公式。

问题是,当你清除单元格中的数据时,它不会同时发生在所有的单元格中。 Excel必须遍历每一个并更新一些东西(单元格的值,格式和公式计算链),如果公式链中的任何内容已更改,则所有公式都会重新计算,并且在每次重新计算时,所有的RANDBETWEEN值得到更新,这将导致所有受影响的COUNIF公式的另一个计算。

因此,当您尝试删除所有这些公式时,对于20k RANDBETWEEN值和20k COUNTIF公式,您可以获得大约600万次计算和多达1800万次写入磁盘(取决于caching)。

所以,不,这不是一个错误,它只是使用RANDBETWEEN函数的一个无意识的结果。