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 格式输入它,但我真的很想知道为什么会这样。任何人都可以帮忙吗?

4

2 回答 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")

首先,Format(..)创建一个 Variant String,但您似乎将其视为创建一个Date.

其次,这一行:Dim dateOne, dateTwo As Date没有像您在编写它时所相信的那样声明两个 Date 变量相反,它声明dateTwo为 Date 变量,但它声明dateOneVariant(默认值),因为您没有对其进行任何其他操作。要使它们都成为您需要的日期Dim dateOne As Date, dateTwo As Date

因此,将这两个事实放在一起,会发生什么dateOne使Format字符串按照您的意图进行,然后由于目标变量是 Variant,因此将其作为 Variant String 存储在那里。

dateTwo但是,工作方式不同,因为它首先按照您告诉它的日期字符串 ("2013/09/01") 生成日期字符串,然后看到您告诉它将 a 分配给String不同Date数据类型的 a,因此它会转换字符串返回日期,但使用本地系统的 NLS 设置来确定如何解释字符串(在您的情况下)导致月份和日期数字被交换。

清除?

于 2013-09-21T18:19:21.760 回答
5

您正在体验经典的 VBA 问题。您声明DateOne为 aVariantDateTwoa Date。要修复,请将其更改为:

Dim dateOne As Date, dateTwo As Date

要了解更多信息,请参阅Chip Pearson 页面并向下滚动到名为“注意使用 One Dim 声明声明的变量”的部分。

于 2013-09-21T18:19:49.637 回答