如何修正VBA时间戳脚本以实现与TODAY()公式的正确日期对比?
问题解决方法
核心问题是你用Format()把日期转成了字符串类型,而TODAY()返回的是Excel的日期序列号(数值型),两者类型不匹配,所以即使显示相同也会返回False。
修改方案很简单:让单元格存储原始日期数值,只通过格式设置来显示成你要的样式,具体改动如下:
修改后的VBA代码
Private Sub Worksheet_Change(ByVal Target As Range) Const ColumnsToMonitor As String = "k:z" Const DateColumn As String = "j" ' 禁用事件防止循环触发 Application.EnableEvents = False If Not Intersect(Target, Columns(ColumnsToMonitor)) Is Nothing Then With Intersect(Target.EntireRow, Columns(DateColumn)) ' 直接赋值日期数值(用Date只存日期部分,和TODAY()匹配度更高) .Value = Date ' 设置显示格式为你需要的样式 .NumberFormat = "ddd d/mm" End With End If Application.EnableEvents = True End Sub
关键改动说明
- 去掉
Format(Now, "ddd d/mm"),直接赋值Date(如果需要保留时间部分,就改成Now,但对比时要使用INT(J2)=TODAY()来忽略时间部分) - 用
.NumberFormat设置单元格的显示格式,这样单元格内部存的是日期数值,显示的是你需要的ddd d/mm样式 - 修正了原代码重复设置
Application.EnableEvents = True的问题,改为先禁用再恢复
测试验证
修改后,J2单元格存储的是Excel可识别的日期数值,公式=IF(J2=TODAY(),1,0)会在日期相同时正常返回1;手动修改日期时,只要输入Excel能识别的日期格式,也能正常参与对比。
内容的提问来源于stack exchange,提问作者Shawn Djontz
相关产品推荐
相关产品推荐

