0

我有一个 Excel 文件,它包含多张工作表的数据。在那一列中,时间戳为 21/6/12 10:33:07:AM。我的系统日期格式是“m/d/yyyy”
,同时将其转换为日期 21/06/2012。我能够得到日期,但它显示错误。06-12-2021 这应该是 21-06-2012。我正在使用下面的代码。

例如:26/6/12 11:15:07:AM 应该是 26/06/2012
21/6/12 10:33:07:AM 应该是 21/06/2012

Public Sub ConvtDate()
Dim ParseDateTime As Date
Application.ScreenUpdating = False
For Each datcol In ws_Raw2.Range("I2:I65536")  
x = InStr(1, datcol, " ", vbTextCompare) - 1  
If x > 0 Then  
    ParseDateTime = DateValue(Left(datcol, x))  
    datcol.Value = ParseDateTime
End If  
Next  
Application.ScreenUpdating = True  
End Sub  

请帮助如何获取日期。
提前致谢。

4

2 回答 2

3

DateValue期望日期为系统设置格式的字符串。
从 Excel 帮助:

如果 date 是仅包含由有效日期分隔符分隔的数字的字符串,则 DateValue 根据您为系统指定的短日期格式识别月、日和年的顺序。

由于您的数据在Day Month Year并且您的系统在您的系统中,因此Month Day Year您将需要重建您传递给的参数DateValue

这是您的 coed 的重构,还处理了其他一些问题:

  • Dim 你所有的变量(Option Explicit用来强制这个)
  • 只处理您需要的行
  • 循环一个变体数组而不是一个范围,它更快

Public Sub ConvtDate()
    Dim ParseDateTime As Date
    Dim i As Long
    Dim x As Long
    Dim a() As String
    Dim dat As Variant
    Dim rng As Range

    Application.ScreenUpdating = False
    Set rng = Range(Cells(2, 9), Cells(Rows.Count, 9).End(xlUp))
    dat = rng.Value
    For i = 1 To UBound(dat, 1)
        x = InStr(1, dat(i, 1), " ", vbTextCompare) - 1
        If x > 0 Then
            a = Split(Left(dat(i, 1), x), "/")
            ParseDateTime = DateValue(a(1) & "/" & a(0) & "/" & a(2))
            ' or if you dont know the system data format use
            ' ParseDateTime = DateSerial(a(2), a(1), a(0))
            dat(i, 1) = ParseDateTime
        End If
    Next
    rng = dat
    Application.ScreenUpdating = True
End Sub
于 2013-08-26T08:15:02.560 回答
0

如果列格式设置为日期,Excel 会将 26/6/12 更改为 26/06/2012 本身。所以

ParseDateTime = Left(datcol, x)

应该这样做。

于 2013-08-26T07:34:51.490 回答