vba格式函数错误地将数字解释为日期

时间:2012-08-03 18:11:59

标签: access-vba

为什么VBA将“093 0005”解释为约会?

在MS Access VBA中,以下行: 格式(“093 0005”,“0000000000000”)返回“0000000034090”

34090是日期5/1/1993的vba数字等价物。

在大多数情况下,不会发生这种日期假设。例如:

格式(“092 0250”,“0000000000000”)返回“092 0250”,即不尝试应用格式。

格式(“0930005”,“0000000000000”)按预期返回“0000000930005”。

到目前为止,我提出的唯一解决方案是在入站字符串包含空格或使用IsDate函数时使用此函数进行编码。

1 个答案:

答案 0 :(得分:4)

这与Access本身无关。在任何VBA中,如果文本由SPACEHYPHENDASH分隔,则格式函数的行为将如下所示。所以这个

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功能无效。为此,您必须使用REPLACEHYPHENDASH替换为SPACE。但是,我怀疑您是否会格式化具有HYPHENDASH的数字。