Dateserial()奇怪的行为

时间:2018-06-01 09:19:53

标签: excel vba

有人可以向我解释为什么这段代码:

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

返回 6/18/2019 ???

3 个答案:

答案 0 :(得分:3)

因为Mid("20180618", 3, 2)18,它在一年中的12个月内溢出,并使年份数增加一个。

显然你的意思是Mid("20180618", 5, 2)

巧合的是,Mid("20180618", 5, 2)Mid("20180618", 3, 2)之间的差异恰好是12(月),因此您只看到年份发生了变化而没有别的。

答案 1 :(得分:2)

您的中间值返回了错误的所需数字,请将其用作中间值

Int(Val(Mid("20180618", 5, 2)))

答案 2 :(得分:1)

每当你有很多参数被评估为代码中不同的东西时,试着看看对每个参数的评价是什么。 Debug.Print是了解它的好方法:

Sub Main()

    Debug.Print (Left("20180618", 4))
    Debug.Print (Mid("20180618", 3, 2))
    Debug.Print (Right("20180618", 2))

End Sub

因此,你会得到:

2018
18
18

从那里可以看到"错误"。如mentioned by @GSerg,当超过12个月作为参数时,年份增加:

Debug.Print DateSerial(2015,13,1)返回01.01.2016

相同的作品几天:

Debug.Print DateSerial(2015,1,363)返回29.12.2015