VBA“格式”函数返回不一致 –

我需要将这些date的格式设置为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等于2013年9月1日。 我疯了吗? 这发生在我的脚本刚开始,我有Option Explicit,我知道这是保存到正确的variables..

 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日。

我原本在不同的date有他们,查询一个范围,在我的头撞到我的键盘之前,以确保我在同样的方式执行function,我复制文本dateOne,粘贴一行,并将该variables更改为dateTwo。 完全相同的命令,分开执行两行,产生不同的结果。 脚本几乎已经完成了,但是为什么它在做它正在做的事情呢?

也许我可以让用户以yyyy / mm / dd的格式input,但是我真的很想知道为什么会这样。 谁能帮忙?

你们的日常工作有两件事是错误的,那就是产生这些看似不合逻辑的结果:

 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(..)创build了一个Variant string ,但是看起来好像它会生成一个Date

其次,这一行: Dim dateOne, dateTwo As Date不会声明两个datevariables,因为您可能会在相信时写下它。 相反,它声明dateTwo是一个Datevariables,但它声明dateOne是一个Variant (默认),因为你没有做任何事情。 要使他们两个date,你需要Dim dateOne As Date, dateTwo As Date

因此,将这两个事实放在一起, dateOne会发生什么情况, Format将按照您的意图创buildstring,然后由于目标variables是Variant,因此将其存储为Variantstring。

dateTwo工作原理是不同的,因为它先告诉它(“2013/09/01”),然后看到你正在告诉它将一个String赋值给不同的数据types的Date ,然后它将string转换date,但使用本地系统的NLS设置来确定如何解释string(在您的情况下)导致月份和date数字交换。

明确?

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

 Dim dateOne As Date, dateTwo As Date 

要阅读更多信息,请参阅Chip Pearson页面,然后向下滚动到“注意用variables声明的variables”部分。