如何从时间戳获取日期

时间:2013-08-26 07:21:35

标签: excel-vba vba excel

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

Ex: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  

请帮助您了解如何获取日期 提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

  

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

由于您的数据位于Day Month Year且系统为Month Day Year,因此您需要重新设置传递给DateValue的参数。

这是你的男女同校的重构,也涉及其他一些问题:

  • 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

答案 1 :(得分:0)

如果列格式化日期,Excel将自动更改为26/6/12至26/06/2012。所以

ParseDateTime = Left(datcol, x)

应该这样做。