2013-09-21 40 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