You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在满足指定条件后停止Excel公式自动更新?

解决Excel中满足条件后停止公式自动更新的问题

我明白你的需求——当「发票完成日期」(D1)填写后,让「未结天数」(C1)停止随TODAY()更新,固定为发票完成时的数值。先提个小细节:你原C1公式里的NETWORKDAYS($C1,$A$1)应该是笔误吧?引用C1自己会导致循环引用,我默认改成NETWORKDAYS($B1,$A$1)来修正这个问题,下面的方案都是基于修正后的逻辑来的。

方案一:用公式实现(无需宏,兼容性好)

这种方法不需要启用宏,通过修改C1的公式逻辑,让它在D1有值时固定计算发票完成当日的未结天数,不再随A1的TODAY()变化。

修改后的C1公式如下:

=IF(B1="","-",IF(D1<>"",NETWORKDAYS($B1,$D1),IF(NETWORKDAYS($B1,$A$1)>0,NETWORKDAYS($B1,$A$1),"-")))

逻辑拆解:

  • 先判断「接收日期」(B1)是否为空,空值就显示-
  • 如果「发票完成日期」(D1)已填写,就计算接收日期到发票完成日期的工作日天数——这个值是固定的,不会随A1的今日日期变化
  • 如果D1为空,就按你原来的逻辑计算:接收日期到今日的工作日天数,大于0就显示数值,否则显示-

方案二:用VBA自动转为静态值(彻底停止更新)

如果希望D1填入日期后,直接把C1的公式替换成当时的计算结果(彻底变成静态文本,以后不管任何单元格变化都不会再更新),可以用工作表事件宏来实现。

操作步骤:

  1. 右键点击你的工作表标签(比如「Sheet1」),选择「查看代码」
  2. 在弹出的VBA编辑器中,粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' 只监控D列的单元格修改事件
    If Not Intersect(Target, Me.Range("D:D")) Is Nothing Then
        Dim cell As Range
        ' 遍历所有被修改的D列单元格
        For Each cell In Intersect(Target, Me.Range("D:D"))
            ' 检查当前行D列是否为日期,且C列是公式状态
            If IsDate(cell.Value) And cell.Offset(0, -2).HasFormula Then
                ' 将C列的公式转为计算后的静态值
                cell.Offset(0, -2).Value = cell.Offset(0, -2).Value
            End If
        Next cell
    End If
End Sub
  1. 关闭VBA编辑器,将文件保存为「启用宏的工作簿(.xlsm)」格式

这个宏的作用是:当你在D列任意单元格填入日期时,该行的C列会自动把公式计算结果转为静态值,彻底停止更新。之后不管A1的TODAY()怎么变,C1的值都不会再改动。

两种方案对比

  • 方案一:无需宏,文件兼容性强;但如果D1的日期被修改,C1会重新计算对应日期的未结天数。
  • 方案二:彻底固定数值,不受任何后续单元格变化影响;但需要启用宏,必须保存为xlsm格式。

内容的提问来源于stack exchange,提问作者D Beech

火山引擎 最新活动