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
声明为Variant
和DateTwo
作为Date
。 要修复,请将其更改为:
Dim dateOne As Date, dateTwo As Date
要阅读更多信息,请参阅Chip Pearson页面,然后向下滚动到“注意用variables声明的variables”部分。