【问题标题】:Stop Excel from updating formula after a criteria is matched匹配条件后停止 Excel 更新公式
【发布时间】:2019-04-14 05:59:58
【问题描述】:

有没有办法在匹配特定条件后阻止公式更新?

例如:

A1 = 1
B1 = '=A1*2'

假设这是当前的。明天的数据会改变

A1 = 2
B1 = '=A1*2'

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

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

【问题讨论】:

  • 您尝试过if 声明吗?在 Excel 单元格中键入 if(logic_test, [value_if_true], [value_if_false])。您应该能够使您的逻辑测试成为日期检查。
  • @MikeZ,我也在想if(),但这并不能真正帮助保存先前计算的值。 B1 需要保持 2if() 不会知道它是两个,只是因为日期的原因你不希望它是 4
  • 这正是我目前的问题,因为这是我最初的想法。我想使用一个新行来复制调整行的值,只要条件不匹配。但我不知道除了写 '=[cellname]' 是否有复制值的方法,因为这无济于事
  • 您也许可以结合使用繁琐的宏来做到这一点,但我不确定单独使用 Excel 有什么方法可以做到这一点。无论是使用宏还是手动,您都可以拥有一个包含所有 A1 值的外部工作表,并且可以为每个工作表指定一个日期。然后你可以有一个 IF 只在适当的日期显示最新的答案。我想不出你会怎么做。

标签: excel excel-formula


【解决方案1】:

一个 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:00,但之后将保持冻结状态。

在这两种方法(循环与 VBA)中,我怀疑非 VBA 可能更有效且可能更可靠(我还没有测试过具有多种功能的 VBA 方法)。另一方面——启用循环引用可能会导致问题(默认情况下不会无缘无故关闭)。

【讨论】:

  • 谢谢...稍后会尝试这个。现在,带有循环引用的公式版本就足够了。感谢您的帮助
【解决方案2】:

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

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

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

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

【讨论】:

  • 是的,我在想同一个方向,但这并不能解决我的问题,或者我做错了。我假设您在谈论 B1 更改而不是 A2 问题是 A2 没有价值。它只是 A1 中的一个值,我需要 B1 中的该值,直到日期匹配......但 A1 之后会发生变化,但 B1 不应该。我不认为有一个简单的解决方案了......太糟糕了
  • B1 是一个错字。我修好了它。我在单元格 A2 中输入了公式。你应该能够重现我的实验。碰巧 - 我仍然打开了那个电子表格。 A2 仍然没有反应。但是(等一下)-我刚刚将 C1 中的时间更改为下午 3:40(未来 2 分钟),现在 A2 随 A1 更改...现在是 3:40,即使 A1 时 A2 再次保持固定已更改。
  • 是的,我试图复制您的工作表,但实际上无法复制,因为我误解了错字并且很困惑,因为您谈到了循环引用。我在B1中输入了公式。现在有了编辑后的版本,这正是我想要的。
  • 很高兴它成功了。我有时有 Excel 阅读障碍,并且倾向于混淆 A2 和 B1 之类的东西。可能是我小时候玩太多战舰游戏了。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多