2013-09-21 41 views
4

我需要将这些日期格式化为yyyy/mm/dd来查询MySQL数据库 - 查看这两个语句,您会认为它们会产生相同的结果,对吧?VBA“格式”函数返回不一致 -

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

dateOne现在等于2013/09/01,而dateTwo等于2013年9月1日。我疯了吗?这发生在我的剧本的非常begininng,我已经得到了显式的选项上,我知道它保存到正确的变量..

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年9月1日,和dateTwo是9/1/2013。

我原本他们在不同的日期,敲我的头伸进我的键盘之前,查询范围 - ,使绝对确保我执行该功能上都以同样的方式,我在dateOne复制的文本,将它粘贴一行,并将变量更改为dateTwo。完全相同的命令,分开执行两行,产生不同的结果。脚本几乎完成了,但是,它是如何做的呢?

也许我可以让用户输入yyyy/mm/dd格式,但我真的很想知道为什么会发生这种情况。谁能帮忙?

回答

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 字符串,但你看起来好像它使被处理它一个Date

其次这一行:Dim dateOne, dateTwo As Date声明两个日期变量,你可能会认为,当你写的。相反,它声明dateTwo是Date变量,但它声明dateOne变体(默认值),因为您没有做任何其他事情。为了使他们两个日期,你需要Dim dateOne As Date, dateTwo As Date

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

dateTwo原理不同,但是,由于它第一次的日期字符串作为你告诉它(“2013年9月1日”),但后来看到你告诉它分配一个StringDate它们是不同的数据类型,所以它然后将字符串转换为日期,但使用本地系统的NLS设置,以确定如何解释这(你的情况)导致被交换的月份和日期数字的字符串。

清除?

+0

谢谢。我在这方面浪费了太多时间。我将它们都改为字符串,现在我可以把这个项目包装起来。我衷心感谢。 – Acantud

5

您正在经历一个经典的VBA陷阱。您声明DateOneVariantDateTwo作为Date。要修复,将其更改为:

Dim dateOne As Date, dateTwo As Date 

要了解更多信息,请参阅本Chip Pearson page和向下滚动到一节“注重声明了一个昏暗的声明变量”。

+0

Bah。我以前做过,我想我不学。谢谢,我很感激。将日期更改为字符串,以便将它们连接到sql语句中。 – Acantud