关于=NOW函数仅在指定单元格更新时触发更新的技术咨询
关于=NOW函数仅在指定单元格更新时触发更新的技术咨询
嘿,这个需求很常见——默认的=NOW()确实有点“过于积极”,只要工作表有任何计算动作(比如打开文件、编辑其他单元格)都会自动刷新,完全没法满足你“只在姓名单元格更新时才更新时间”的要求。不过有两种靠谱的方法可以解决:
方法一:用VBA事件宏(最稳定可靠)
这是我最推荐的方案,逻辑直白,不容易出问题:
- 右键点击你的工作表标签(比如Sheet1),选择「查看代码」
- 在弹出的VBA编辑器窗口里,粘贴这段代码:
Private Sub Worksheet_Change(ByVal Target As Range) ' 这里假设姓名单元格在B列,对应时间要放在左边的A列,你可以根据自己的表格调整列数 If Target.Column = 2 And Target.Cells.Count = 1 Then ' 当B列的单个单元格被修改时,把左边单元格设为当前时间 Target.Offset(0, -1).Value = Now() End If End Sub
- 保存文件的时候,要选择「启用宏的工作簿(.xlsm)」格式,不然宏会失效
- 之后只要你编辑B列的姓名单元格,对应的时间单元格就会自动更新为当前的日期和时间,而且不会随便刷新
方法二:用迭代计算+公式(不用宏的替代方案)
如果你不想用宏,也可以用这个技巧,不过需要先做一点设置:
- 打开Excel的「选项」,切换到「公式」标签,勾选「启用迭代计算」,把迭代次数设为1,点击确定
- 假设你的姓名在B2单元格,要显示时间的是A2,在A2输入这个公式:
=IF(B2<>"", IF(A2="", NOW(), IF(B2<>B2_OLD, NOW(), A2)), "")
- 接下来要定义一个名称来存储姓名的旧值:按Ctrl+F3打开「名称管理器」,点击「新建」,名称填
B2_OLD,引用位置填=Sheet1!$B$2(记得把Sheet1改成你实际的工作表名称) - 这样设置后,只有当B2的姓名被修改时,A2才会更新为当前时间,否则保持原来的时间不变
小提醒
- VBA方法需要你打开文件时启用宏(现在Excel默认会禁用,你需要在顶部的安全提示里点击启用)
- 迭代计算的方法要注意别在其他地方用容易触发循环引用的公式,不然可能会影响这个功能的正常工作
备注:内容来源于stack exchange,提问作者SkyGuy15
相关产品推荐
相关产品推荐

