如何将Excel VBA默认日期格式从美国转为英国格式?
让Excel VBA遵循英国日期格式的解决方案
嗨,这两个需求都完全能实现!我给你整理了两种靠谱的方案,还有避坑的最佳实践建议:
1. 强制所有VBA日期逻辑遵循英国格式
如果不想依赖系统设置,或者要确保代码在任何环境下都按英国格式运行,有两种思路:
思路1:明确构造日期,彻底避免区域歧义
最稳妥的方式是不要让VBA去解析模糊的日期字符串(比如"12/5/2012",美国和英国格式的含义完全相反),而是直接用DateSerial函数指定年、月、日,这样不管什么区域设置都不会出错:
Sub DateFormat() Dim myDate As Date ' 直接按「年/月/日」构造,完全消除歧义 myDate = DateSerial(2012, 5, 12) Dim myDate1 As String myDate1 = Format(myDate, "dd-mmm-yy") MsgBox myDate1 ' 会输出你预期的「12-May-12」 End Sub
思路2:临时切换VBA的区域设置为英国
如果必须解析字符串格式的日期,可以通过Windows API临时把当前线程的区域设置改成英国,用完再恢复,这样所有日期相关函数都会遵循英国格式:
' 先声明Windows API函数(64位Excel用PtrSafe,32位可以去掉) Private Declare PtrSafe Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" ( _ ByVal Locale As Long, _ ByVal LCType As Long, _ ByVal lpLCData As String _ ) As Boolean Private Const LOCALE_USER_DEFAULT = &H400 Private Const LOCALE_SSHORTDATE = &H1F ' 控制短日期格式的参数 Sub ForceUKDateFormat() ' 先保存当前系统的短日期格式,用完要恢复 Dim originalShortDate As String originalShortDate = Application.International(xlShortDate) ' 设置为英国标准的短日期格式「dd/MM/yyyy」 SetLocaleInfo LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, "dd/MM/yyyy" ' 现在执行你的日期逻辑,字符串会按英国格式解析 Dim myDate As Date myDate = DateValue("12/5/2012") ' 此时会解析为2012年5月12日 Dim myDate1 As String myDate1 = Format(myDate, "dd-mmm-yy") MsgBox myDate1 ' 输出「12-May-12」 ' 一定要恢复原来的设置,避免影响Excel的其他操作 SetLocaleInfo LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, originalShortDate End Sub
注意:这个方法会临时改变Excel的日期解析规则,所以必须在代码末尾恢复原设置,否则会影响用户的其他Excel操作。
2. 借助电脑已有的英国区域设置本地化VBA代码
其实VBA默认是跟随Windows系统的区域设置的,但有时候需要确认几个开关:
- 首先确保你的Windows系统已经设置为英国区域:打开「控制面板>区域>格式」,选择「英语(英国)」,并点击「确定」
- 然后打开Excel,进入「文件>选项>高级」,找到「编辑自定义列表」上方的**「使用系统分隔符」**,勾选这个选项
- 完成以上设置后,VBA中的
DateValue、CDate等日期函数会自动使用系统的英国格式解析字符串,不需要额外修改代码
如果设置后还是没生效,大概率是Excel的「使用系统分隔符」没勾选,或者代码中硬编码了美国格式的日期解析逻辑。
最后给个最佳实践建议
尽量避免使用"12/5/2012"这种模糊的日期字符串,改用ISO标准日期格式「yyyy-mm-dd」,这种格式是全球通用的,VBA会自动正确解析,不管什么区域设置:
myDate = DateValue("2012-05-12") ' 不管美国还是英国区域,都会解析为2012年5月12日
内容的提问来源于stack exchange,提问作者Ang Yiwei
相关产品推荐
相关产品推荐

