2013-08-26 31 views
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 

请帮助如何获取日期。
在此先感谢。

回答

2

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

如果日期是其中仅包含由有效的日期分隔符分隔的数字字符串,则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 
+0

谢谢克里斯。 但代码循环(迭代)只有一次 – user2717144

+0

对于i = 1到UBound(dat,2) 你能帮助如何解决这个问题。 – user2717144

+0

哎呀,一个错字...应该是'For i = 1 To UBound(dat,1)' –

0

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

ParseDateTime = Left(datcol, x) 

应该这样做。

+0

但它改变到12/06/2026。而不是06/26/2012 – user2717144

相关问题