VBA Access中用户定义的日期格式

时间:2016-04-05 15:51:44

标签: ms-access access-vba

我无法弄清楚如何告诉VBA正确的日期格式,因为它似乎以错误的方式假设。因此CDate("24/02/2016 10:59")给出了正确的日期 - dd / mm / yyy。但是当它迭代CDate("01/03/2016 00:59")这样的日期时 - 它假设03号不是一个月而是一天,所以VBA假定它是mm/dd/yyyy,所以它给了我一个约会03/01/2016这是错误的并弄乱了我的数据。那么我怎么能告诉VBA它实际上是dd / mm / yyyy格式。即使它"2016/01/14",VBA似乎也能很好地自动获取,但是如果数字的哪个部分数月是不明显的话,它就会失败。 ddmm都小于12。

我使用WS.Cells(irow, icol).Value从CSV文件中读取此日期。

这是我到目前为止所尝试的:

datDate = CDate(Format(WS.Cells(iRow, iCell).Value, "dd-mmm-yyyy hh:mm:ss"))

3 个答案:

答案 0 :(得分:3)

CDate()函数遇到不明确的"aa/bb/yyyy"日期字符串时,它将根据月份和日期以Windows中的区域设置定义的短日期格式出现的顺序进行解释。

例如:

当我的机器设置为"英语(美国)"如果日期格式为M/d/yyyy,则Month(CDate("02/04/2016"))会返回2

但是,将我的区域设置更改为"英语(加拿大)"如果日期格式为dd/MM/yyyy,则Month(CDate("02/04/2016"))会返回4

请注意,这与在SQL语句中解释不明确的#aa/bb/yyyy# date literals 时Jet / ACE数据库引擎的行为不同。在这种情况下,无论区域设置如何,它都会将它们解释为mm/dd/yyyy

一如既往,最佳解决方案是确保字符串表示使用不明确的日期格式,例如,2016/02/04始终解释为2月4日。

答案 1 :(得分:2)

使用mm / dd / yyyy hh:nn:ss喜欢:

#03/01/2016 16:32:58#

或DateSerial和TimeSerial:

DateSerial(2016, 03, 01) + TimeSerial(16, 32, 58)

要解析字符串,请使用Mid:

TrueDate = Dateserial(Mid(s, 7, 4), Mid(s, 4, 2), Mid(s, 1, 2)) + TimeSerial(Mid(s, 12, 2), Mid(s, 15, 2), 0)

s = "01/03/2016 00:59"
' Returns: 2016-03-01 00:59:00 

s = "24/02/2016 10:59"
' Returns: 2016-02-24 10:59:00 

答案 2 :(得分:-1)

转换前更改日期的格式。像这样的东西;

Dim strDate As String, strFormatDate As String
Dim dte As Date

strDate = "01/03/2016 00:59"

strFormatDate = Format(strDate, "dd-mmm-yyyy hh:nn")

dte = CDate(strFormatDate)

这会将日期字符串更改为01-Mar-2016 00:59,它应该转换为日期数据类型而不会产生混淆。