2012-08-03 34 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