liulangren
回答者
回答于 2026-10-25
在Excel中,使用TODAY()或NOW()函数的单元格会在每次工作簿打开或重新计算时自动刷新。要让满足特定条件的单元格停止更新并固定为当时的日期,仅靠常规公式无法实现(因为公式结果始终动态变化),必须借助VBA宏或启用迭代计算。
方法一:使用VBA工作表事件(推荐)
通过监控单元格变化,当满足条件时将公式替换为固定的日期值。
- 按
Alt + F11打开VBA编辑器。 - 在左侧工程资源管理器中双击目标工作表。
- 输入以下代码(假设A列输入状态,B列记录日期,当A列为"完成"时B列停止更新):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
For Each cell In Target
If cell.Column = 1 And cell.Value = "完成" Then
If cell.Offset(0, 1).Value = "" Then
Application.EnableEvents = False
cell.Offset(0, 1).Value = Date
Application.EnableEvents = True
End If
End If
Next cell
End Sub
- 保存文件为
.xlsm格式。
方法二:启用迭代计算(无需VBA)
利用循环引用特性,在满足条件时保留原值。
- 点击“文件”>“选项”>“公式”,勾选“启用迭代计算”,将最多迭代次数设为1。
- 假设C1为触发条件单元格,在目标单元格输入公式:
=IF(C1="是", IF(B1="", TODAY(), B1), "") - 当C1变为"是"且该单元格为空时,写入当天日期;后续因迭代次数限制,B1已有值则不再调用
TODAY()。
适用条件与注意事项
- VBA方法可靠性高,但要求文件保存为启用宏的格式,且用户需允许运行宏。
- 迭代计算方法无需宏支持,但修改公式逻辑较复杂,且可能影响工作簿中其他依赖正常计算的公式。
- 两种方法的核心逻辑均为:判断条件是否首次满足,若是则将动态函数结果转化为静态数值存储。