我需要将这些日期格式化为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 on,我知道它正在保存到正确的变量..
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是2013年9月1日。
我原本在不同的日期让他们查询一个范围 - 在将我的头撞到我的键盘之前,让完全确定我在两者上执行相同的功能,我复制了dateOne中的文本,向下粘贴一行,并将变量更改为dateTwo。完全相同的命令,分开执行两行,产生不同的结果。脚本差不多完成了,但它是如何,为什么,它正在做它正在做的事情?
也许我可以要求用户以yyyy / mm / dd格式输入它,但我真的想知道为什么会这样。有人可以帮忙吗?
答案 0 :(得分: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
不 声明两个日期变量,因为您在编写时可能会相信这些变量。相反,它将dateTwo
声明为Date变量,但它将dateOne
声明为 Variant (默认值),因为您没有做任何其他事情。要使它们成为两个日期,您需要Dim dateOne As Date, dateTwo As Date
。
因此,将这两个事实放在一起,dateOne
会发生什么Format
使您想要的字符串,然后由于目标变量是Variant,将其存储为Variant字符串。
dateTwo
的工作方式不同,因为它首先将日期字符串设为(“2013/09/01”),但随后会看到您告诉它指定{{1}到String
不同的数据类型,然后将字符串 返回 转换为日期,但使用本地系统的NLS设置来确定如何解释字符串(在您的情况下)导致交换月份和日期数字。
清除?
答案 1 :(得分:5)
您正在体验经典的VBA陷阱。您将DateOne
声明为Variant
,将DateTwo
声明为Date
。要修复,请将其更改为:
Dim dateOne As Date, dateTwo As Date
要了解更多内容,请参阅此Chip Pearson page并向下滚动到“注意使用一个Dim声明声明的变量”一节。