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

时间:2013-09-21 18:02:17

标签: excel vba

我需要将这些日期格式化为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格式输入它,但我真的想知道为什么会这样。有人可以帮忙吗?

2 个答案:

答案 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声明声明的变量”一节。