2012-08-03 63 views
4

爲什麼VBA將「093 0005」解釋爲日期?vba格式函數將數字錯誤地解釋爲日期

在MS Access VBA,以下行: 格式( 「093 0005」, 「0000000000000」)返回 「0000000034090」

34090是日期1993年5月1日的VBA數字等效。

在大多數情況下,這種日期假設不會發生。例如:

格式(「092 0250」,「0000000000000」)返回「092 0250」,即不嘗試應用格式。

格式(「0930005」,「0000000000000」)按預期返回「0000000930005」。

到目前爲止,我唯一提出的解決方案是在入站字符串包含空格或使用IsDate函數時使用此函數進行編碼。

回答

4

這與Access本身無關。在任何VBA中,如果文本被SPACE,HYPHENDASH分隔,格式函數的行爲將如此。因此,這

Debug.Print Format("093 0005", "0000000000000") 
Debug.Print Format("093/0005", "0000000000000") 
Debug.Print Format("093-0005", "0000000000000") 

將返回0000000034090

它會嘗試將其轉換爲日期數量,如果它是一個有效的日期或數字,然後它會告訴你它的數值等同於。如果它不是一個相當的日期或數字,那麼它將保持原樣。我相信原因是Format函數無法確定值的「格式」並將其作爲字符串。這與說Format("Blah", "0000000000000")相似。這是顯而易見的,你不會指望Format函數將其格式化爲000000000blah

不幸的是我找不到MS知識庫中的任何文章,它解釋了爲什麼Format函數的行爲如此。

我過去發現解決它的唯一方法是使用VAL函數將其轉換爲數字。所以

Debug.Print Format(Val("093 0005"), "0000000000000") 

會給你想要的結果0000000930005

然而,如果數由一個HYPHENDASH分開那麼VAL功能是沒用的。爲此,您必須使用REPLACE替換HYPHENDASHSPACE。不過,我懷疑你會格式化數字有HYPHENDASH

+0

感謝您的澄清。我想我很驚訝的是,該功能將數字解釋爲日期,當請求的格式不是日期樣。你的解決方案在我的情況下工作。我也可以使用:De – 2012-08-04 11:28:09

+0

Rick當你在即時窗口中輸入'?格式(Val(「093 0005」),「0000000000000」)'你會得到什麼? – 2012-08-04 16:02:54

+0

我得到0000000930005 – 2012-08-05 17:36:48