匹配条件后,停止Excel更新公式

时间:2015-06-23 21:28:29

标签: excel excel-formula

是否有办法在匹配某个条件后停止更新公式?

例如:

A1 = 1
B1 = '=A1*2'

让我们说这是现在的。明天数据将会改变

A1 = 2
B1 = '=A1*2'

我需要能够将单元格B1的值固定为2(1 * 2),而不是将其更新为4(2 * 2)。触发器应该是日期。

A1中的值将动态切换;我无法阻止,我只需要能够在匹配日期后阻止其他单元格更新。

3 个答案:

答案 0 :(得分:2)

您可以使用循环引用。例如,在A2中我输入了

=IF(NOW() < C1,2*A1,A2)

C1的值为6/24/2015 14:39

我在文件&gt;下启用循环引用选项&gt;公式。在2:39之前我的时间我能够改变A1的值并看到A2的变化。那是2分钟前(在我的时区)。现在当我改变A1时,A2的值保持不变。

答案 1 :(得分:2)

VBA答案。这个甚至可以在禁用循环引用的情况下工作(尽管它不太灵活)。它定义了两个工作表函数,可以选择性地评估单元格中的公式或冻结它们,具体取决于条件:

Function EvaluateIf(expression As String, condition As Boolean) As Variant
    Application.Volatile
    Dim myText As String
    Dim myVal As Variant
    If condition Then
        myVal = Application.Evaluate(expression)
    Else
        myText = Application.Caller.Text
        If IsNumeric(myText) Then
            myVal = Val(myText)
        Else
            myVal = myText
        End If
    End If
    EvaluateIf = myVal
End Function


Function FreezeAfter(expression As String, deadline As Date) As Variant
    Application.Volatile
    Dim myText As String
    Dim myVal As Variant
    If Now > deadline Then
        myText = Application.Caller.Text
        If IsNumeric(myText) Then
            myVal = Val(myText)
        Else
            myVal = myText
        End If
    Else
        myVal = Application.Evaluate(expression)
    End If
    FreezeAfter = myVal
End Function

说明它们的用途。如果在B1中你输入= EvaluateIf(“2 * A1”,C1)那么当C1包含= True()时B1用A1更新但如果C1有= False()则B1保持冻结状态。对于第二个函数,如果在B2中输入= FreezeAfter(“A1 * 2”,C2),如果在C2中你有类似6/25/2015 1:00:00 PM的东西那么B2中的公式将用A1更新到下午1点,但之后会一直冻结。

在这两种方法中(圆形与VBA)我怀疑非VBA可能更有效并且可能更可靠(我没有用各种各样的函数测试VBA方法)。另一方面 - 启用循环引用可能会导致问题(默认情况下不会无故关闭)。

答案 2 :(得分:0)

没有简单的方法可以做到这一点。 我只是简单地添加了两个包含@NOW()函数的时间戳单元格,它们的格式设置为显示时间。另一个包含@Today以显示日期。然后,我将特殊粘贴复制到正确的单元格,并保留值和源格式。