Excel VBA设置小于等于动态当日日期的数据验证时报1004错误
解决方案
核心报错原因
你遇到的1004错误在该场景下绝大多数是由Excel界面语言和公式函数名不匹配导致的:你当前使用的是波兰语版Excel(错误提示为波兰语),无法识别英文的NOW()/TODAY()函数,公式解析失败就会触发报错。
除此之外还有两种低频触发原因:
- 运行代码时选中了图表、形状等非单元格对象,Selection不是合法的单元格区域
- 当前操作的工作表处于保护状态,不允许修改单元格验证规则
解决方法
1. 优先使用多语言兼容写法(推荐)
用VBA内置的Application.International属性自动适配当前Excel语言对应的今日函数,不需要硬编码函数名,适配所有语言版本的Excel:
' 先校验当前选中的是否为单元格区域 If TypeName(Selection) <> "Range" Then Exit Sub ' 若工作表已保护,先临时取消保护(保护密码如果有就填在Password参数里) ' ActiveSheet.Unprotect Password:="你的密码" With Selection.Validation .Delete .Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, Operator:=xlLessEqual, Formula1:="=" & Application.International(xlTodayFunction) & "()" .ErrorMessage = "Wprowadź datę w formacie dd.mm.rrrr" End With ' 取消保护后需要重新保护的话加上这行 ' ActiveSheet.Protect Password:="你的密码"
2. 波兰语版直接写对应本地函数
如果只在波兰语版Excel中使用,也可以直接替换为波兰语的今日函数DZISIAJ():
With Selection.Validation .Delete .Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, Operator:=xlLessEqual, Formula1:="=DZISIAJ()" .ErrorMessage = "Wprowadź datę w formacie dd.mm.rrrr" End With
补充说明
如果只需要校验日期不需要校验时间,用今日函数比NOW()更合理,NOW()带时分秒参数,可能会出现当日日期因时间判断不通过的问题。
内容的提问来源于stack exchange,提问作者Filip Frątczak
相关产品推荐
相关产品推荐

