防止计算细胞

时间:2014-08-22 13:17:18

标签: excel excel-vba excel-formula vba

是否可以防止在Excel工作表中发生单个单元格的计算?让我们说我有1001个单元计算速度非常快,但是1个单元格减慢了单页,是否可以仅禁用该单元格的计算?

我不想做的事情:

  1. 以编程方式禁用所有单元格计算
  2. 在全局计算设置为手动
  3. 的同时以编程方式计算特定单元格

4 个答案:

答案 0 :(得分:4)

使用Excel的=IF()功能。它设置为“短路” - 它仅在第一个参数为真时评估第二个参数,对第三个参数则相反。

因此,如果单元格是C1,则单元格的公式当前是

=LOOKUP(2,1/(A1:A100000=666),B1:B100000)

并且您希望仅在D1为真时计算它,使用

=IF(D1,LOOKUP(2,1/(A1:A100000=666),B1:B100000),C1)

注意它是一个循环引用 - 当D1为假时,它是如何保持值相同的。如果要删除警告消息,请启用迭代。

另一种方法是使用其中一个第三方加载项,允许您在表外存储全局变量然后检索它,这将使用如下语法:

=IF(D1,SetGlobal("C1StoredCalculation",LOOKUP(2,1/(A1:A100000=666),B1:B100000)),GetGlobal("C1StoredCalculation"))

SetGlobal()GetGlobal()也可以用VBA编写,虽然它们比XLL慢一点,如果重置VBA项目,它们将失去价值。

答案 1 :(得分:2)

Excel没有禁用单个单元格计算的方法。 您可以将慢速公式移动到单独的工作表中,并使用worksheet.enablecalculation禁用该工作表的计算。

或者您可以将公式存储在文本中,将结果存储为单元格中的值,然后在计算时恢复公式。

答案 2 :(得分:2)

您可以使用替换 UDF 并利用缺乏波动性。

假设我们有一个类似的公式:

=LOOKUP(2,1/(A1:A100000=666),B1:B100000)

如果cols A B 中的任何单元格发生变化,但 UDF

,Excel将重新计算此值
Public Function myudf(r As Range) As Variant
    myudf = Evaluate("LOOKUP(2,1/(A1:A100000=666),B1:B100000)")
End Function

只会在其参数更改时重新计算。所以选择一个单元格并输入:

=myudf(Z100)

对cols中的单元格进行任何更改 A B myudf 将保持不重新计算,直到您更改 Z100

您可以使用相同的小技巧来制作"准易失性"版本 = TODAY() = NOW() = RAND()

答案 3 :(得分:0)

我不认为这可以做到。您可以关闭整个工作簿中的自动计算(如您所述),但我认为没有办法在单个单元格上执行此操作。