You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DateSerial()函数异常行为咨询:为何代码返回6/18/2019?

为什么这段VBA代码返回6/18/2019而不是预期的2018/06/18?

这问题的根源出在你使用Mid函数时的起始位置参数搞错了,咱们把代码拆成几个部分逐一分析,就能一目了然:

  1. 年份部分:Left("20180618", 4) 会提取字符串的前4位,得到 "2018",转成数值后是2018,这部分完全没问题。
  2. 出错的月份部分:Mid("20180618", 3, 2) 这里要注意,VBA里的Mid函数起始索引是从1开始计数的!你传入的起始位置是3,所以会从字符串第3位(也就是字符1)开始取2位,最终得到的是 "18",转成数值后就是18。
  3. 日期部分:Right("20180618", 2) 提取最后2位得到 "18",转成数值18,这部分是对的。

接下来关键的点:VBA的DateSerial函数有一个自动进位的特性——当你传入的月份或日期超出合理范围时,它会自动向上一级单位进位。比如你传入的月份是18,18个月等于1年(12个月)加6个月,所以年份2018会被加上1年变成2019,剩下的6个月加上日期18,最终就得到了6/18/2019。

修正后的代码

要正确提取月份,你需要把Mid的起始位置改成5(因为月份是从第5位开始的),修正后的代码如下:

MsgBox DateSerial(Int(Val(Left("20180618", 4))), Int(Val(Mid("20180618", 5, 2))), Int(Val(Right("20180618", 2))))

运行这段代码就会返回你预期的6/18/2018了。

内容的提问来源于stack exchange,提问作者ch1zra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:56:08