VBA的“Format”函数返回结果不一致

4

我需要将这些日期格式化为yyyy/mm/dd以查询MySQL数据库 - 看这两个语句,你会认为它们会产生相同的结果,对吧?

dateOne = Format(#9/1/2013#, "yyyy/mm/dd")
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd")

现在dateOne等于2013/09/01,而dateTwo等于9/1/2013。我是不是疯了?这发生在我的脚本非常开始的地方,我已经打开了Option Explicit,并且知道它正在保存到正确的变量中。

Sub main()

Dim dateOne, dateTwo As Date
Dim answer As Integer
answer = MsgBox("Would you like to generate a Transfer Report?", vbYesNoCancel + vbQuestion)
If answer <> 6 Then Exit Sub

'dateOne = InputBox("Input the first (earliest) date in mm/dd/yyyy format")
'dateTwo = InputBox("Input the second (latest) date in mm/dd/yyyy format")

dateOne = Format(#9/1/2013#, "yyyy/mm/dd")

dateTwo = Format(#9/1/2013#, "yyyy/mm/dd")

现在dateOne是2013/09/01,dateTwo是9/1/2013。
我原本将它们设置为不同的日期以查询范围-但当我遇到问题时,我将dateOne的文本复制并粘贴到下一行,并将变量更改为dateTwo,以确保以相同的方式执行函数。 但是在执行完全相同的命令后,它们产生了不同的结果。脚本几乎完成了,但是它为什么会这样做?
也许我可以要求用户以yyyy / mm / dd格式输入日期,但我真的想知道为什么会出现这种情况。有人能帮忙吗?
2个回答

7
你的例程有两个问题,结合起来会产生看似不合逻辑的结果:
Sub main()

Dim dateOne, dateTwo As Date
Dim answer As Integer
.
.
.
dateOne = Format(#9/1/2013#, "yyyy/mm/dd")    
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd")

首先,格式(..)创建一个Variant 字符串,但您似乎将其视为日期
其次,这一行:Dim dateOne, dateTwo As Date并没有像您可能认为的那样声明两个日期变量。相反,它声明dateTwo为日期变量,但由于您没有将dateOne设置为其他内容,因此它将其声明为Variant(默认值)。要使它们都成为日期,您需要使用Dim dateOne As Date, dateTwo As Date
因此,结合这两个事实,dateOne会按照您期望的方式制作字符串,然后由于目标变量是Variant,所以将其作为Variant字符串存储在那里。
然而,dateTwo的工作方式略有不同,因为它首先按照您指定的方式制作日期字符串("2013/09/01"),但然后看到您告诉它将一个字符串分配给一个日期,它们是不同的数据类型,因此它将字符串转换回日期,但使用您本地系统的NLS设置来确定如何解释字符串,这会导致月份和日期数字被交换。
清楚吗?

谢谢您。我在这上面浪费了太多时间。我把它们都改成字符串了,现在我可以完成这个项目了。非常感谢。 - Acantud

5
你遇到了一个经典的VBA陷阱。你声明DateOneVariant,而将DateTwo声明为Date。要解决问题,请更改为:
Dim dateOne As Date, dateTwo As Date

要了解更多,请查看Chip Pearson页面,并向下滚动到名为“Pay Attention To Variables Declared With One Dim Statement.”的部分。


啊,我以前做过这个,我想我没有学到什么。非常感谢,我很感激。将日期更改为字符串,以便它们可以连接到SQL语句中。 - Acantud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接