2013-08-26 3 views
0

Имея один файл Excel, он содержит данные с несколькими листами. В этом столбце, имеющем отметку времени, как 21/6/12 10: 33: 07: AM. Формат моей системной даты: «m/d/yyyy»
при преобразовании даты 21/06/2012. я могу получить дату, но она проявляется не так. 06-12-2021 это должно быть 21-06-2012. я использую приведенный ниже код.Как получить Date from Time Stamp

Пример: 26/6/12 11: 15: 07: АМ должно быть 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

Смежные вопросы